【问题标题】:How can I get the name of the calling function in C#?如何在 C# 中获取调用函数的名称?
【发布时间】:2012-08-23 18:54:43
【问题描述】:

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

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

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

【问题讨论】:

  • 能否请您指定它是用于 asp.net 还是 winforms,以便您获得更多帮助? :)
  • 我不确定使用这种颗粒反射的任何东西本身是否可以称为“高效”。
  • PostSharp 之类的内容对您有帮助吗?
  • 堆栈跟踪对我来说非常可靠,如果这是您需要做的,那么您只需要吸收反射的性能影响。
  • @HanletEscaño 这是用于后端服务的。

标签: c#


【解决方案1】:

升级到 c# 5 并使用CallerMemberName

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

编辑

c# 5 的其他好东西

public void Method([CallerMemberName] string name="",
                   [CallerLineNumber] int line=-1,
                   [CallerFilePath] string path="")
{
}

【讨论】:

  • 哇,我不知道 C# 5 的存在。这是 Jon Skeet 的版本吗?
  • @UweKeim 你没听过VS2012吗?
  • :( 这不是我的决定。
  • @LB 在某个地方的 stackoverflow 上看到了这些,但它仅适用于 .NET4.5 及更高版本:(
  • @shobhit 是的,版本编号很奇怪,c#5 自带.Net 4.5
【解决方案2】:

您可以将 L.B 的答案中提到的 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
  {
  }
}

【讨论】:

  • 太棒了!!这就像一个魅力。它使我们当前的项目免于升级所有构建服务的麻烦。谢谢!
  • @Jakob:但请记住:构建代理必须使用 vs2012,否则方法参数将始终为空,例如在 INotifyPropertyChanged-Implementations 中使用时会给您带来很多(性能)麻烦。 ..
  • 是的,我注意到这一点很困难...... :) 我们的其中一个构建服务器还无法升级,所以我们被卡住了。我现在要做的是检查传入的文件和成员信息。如果它是由调用者属性输入的,我很高兴,但如果不是,我可以回退到旧式 StackTrace 查找。这样我就可以使用正确的方法签名并获得预期的信息。当我们的服务器在一两个月内升级时,我会自动获得性能提升。
【解决方案3】:

你可以这样做:

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

它适用于任何版本的框架/语言。

【讨论】:

  • 也可能会根据您构建的配置以及进行的优化而有所不同......如果有任何内联......使用起来非常痛苦。
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2023-04-07
  • 2023-03-31
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多