【问题标题】:How I can get the calling methods in C# [duplicate]如何在 C# 中获取调用方法 [重复]
【发布时间】:2010-09-28 12:49:03
【问题描述】:

可能重复:
How can I find the method that called the current method?

我需要一种方法来知道 C# 中调用方法的名称。

例如:

private void doSomething()
{
// I need to know who is calling me? (method1 or method2).

// do something pursuant to who is calling you?
} 

private void method1()
{
 doSomething();
}

private void method2()
{
 doSomething();
}

【问题讨论】:

  • 什么情况下需要知道?
  • 这闻起来像是糟糕的编程习惯,请告诉我们您为什么要这样做? ;-)
  • 将参数传递给 doSomething() 函数,具体取决于调用它的人。
  • 是的,这通常不是一个好主意
  • 我可以想到一个好主意的情况——如果你有共享代码负责一些横切关注点,例如日志记录,您可能希望此信息专门用于共享代码的输出 - 我在服务调用日志记录中使用这种做法,实用程序函数为服务调用设置安全性和日志记录,并将调用函数的身份用于日志记录和检查安全访问权限

标签: c# reflection


【解决方案1】:

来自http://www.csharp-examples.net/reflection-calling-method-name/

using System.Diagnostics;

// get call stack
StackTrace stackTrace = new StackTrace();

// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

【讨论】:

  • 我认为在发布版本中你不能依赖这个,因为 jit 编译器可以优化代码,所以名称可能不同。
  • 但是我怎样才能得到以前的方法调用。更改 GetFrame() 为您提供调用堆栈中的所有方法。
  • 这就是 (1) 的用途。您必须使用 [MethodImpl(MethodImplOptions.NoInlining)] 来确保您的方法不会被内联。
  • 是的,但是应避免出于调试或日志记录以外的任何原因提取堆栈跟踪。这可能会导致糟糕的性能。
  • 性能可能更差,但就我而言(最多连续调用 150 次),我什至无法测量差异。但是,我无法充分强调 Stormenet/Hans Passant 所说的不依赖于发布版本中的这一点。我花了两天的时间寻找一个错误,然后发现了这个问题。它几乎是多云的,因为您可以添加无意义的代码来阻止内联,并且您的代码将在调试模式下工作。
【解决方案2】:

您几乎肯定不想这样做。调用者永远不应该知道是谁在调用它。相反,应该将两个调用者之间的差异抽象为一个参数,并传递给被调用的方法:

private void doSomething(bool doItThisWay)
{
    if (doItThisWay)
    {
        // Do it one way
    }
    else
    {
        // Do it the other way
    }
}

private void method1()
{
    doSomething(true);
}

private void method2()
{
    doSomething(false);
}

这样,如果你添加一个method3,它可以以一种方式或另一种方式做某事,而doSomething不会在意。

【讨论】:

  • 您可能只想在输出一些调试信息时这样做
  • @Andrey:调试等总是一种特殊情况。如果 OP 对调试感兴趣,他可能应该这么说。在调试(跟踪、性能检测等)之外,这不是一个好主意。
  • @Downvoter:这个答案有什么问题?
  • @JohnSaunders 这不是一个正确的答案。你没有得到方法名
  • @John Saunders 他只是表示这更适合作为评论而不是答案,因为它没有给他原始问题的实际答案。
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 2010-11-12
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多