4

我需要在 C# 中获取调用函数的名称。我阅读了有关 stackframe 方法的信息,但到处都说它不可靠并且会损害性能。

但我需要它用于生产用途。我正在编写一个自定义跟踪器,它将记录调用跟踪的方法的名称。

有人可以帮助提供一种有效的方法来获取调用函数名称吗?我正在使用 Visual Studio 2010。

4

3 回答 3

12

upgrade to c# 5 and use CallerMemberName

public void Method([CallerMemberName] string caller="")
{
}

EDIT

Other nice things with c# 5

public void Method([CallerMemberName] string name="",
                   [CallerLineNumber] int line=-1,
                   [CallerFilePath] string path="")
{
}
于 2012-08-23T18:58:01.427 回答
9

您可以使用 LB 的答案中提到的 C# 4.5 属性与 .NET 3.5 或更高版本,只需声明它们(您需要使用 vs2012 或更高版本进行编译,否则不会出现任何错误,但参数值将保持为空!):

namespace System.Runtime.CompilerServices
{
  [AttributeUsageAttribute(AttributeTargets.Parameter, Inherited = false)]
  public sealed class CallerMemberNameAttribute : Attribute
  {
  }

  [AttributeUsageAttribute(AttributeTargets.Parameter, Inherited = false)]
  public sealed class CallerFilePathAttribute : Attribute
  {
  }

  [AttributeUsageAttribute(AttributeTargets.Parameter, Inherited = false)]
  public sealed class CallerLineNumberAttribute : Attribute
  {
  }
}
于 2012-10-23T08:24:09.433 回答
7

You can do something like:

 var stackTrace = new StackTrace();
 var name = stackTrace.GetFrame(1).GetMethod().Name;

and it work with any version of the framework/language.

于 2012-08-23T18:57:40.233 回答