我需要在C#中获取调用函数的名称。我阅读了关于栈帧方法,但是到处都说它不可靠并且损害了性能。如何获取C#中调用函数的名称?
但我需要它用于生产使用。我正在编写一个自定义示踪器,它将记录跟踪调用方法的名称。
有人可以请一个有效的方法来获得调用函数名称的帮助吗?我使用Visual Studio 2010中
我需要在C#中获取调用函数的名称。我阅读了关于栈帧方法,但是到处都说它不可靠并且损害了性能。如何获取C#中调用函数的名称?
但我需要它用于生产使用。我正在编写一个自定义示踪器,它将记录跟踪调用方法的名称。
有人可以请一个有效的方法来获得调用函数名称的帮助吗?我使用Visual Studio 2010中
你可以这样做:
var stackTrace = new StackTrace();
var name = stackTrace.GetFrame(1).GetMethod().Name;
,并将其与框架/语言的任何版本。
这不适用于'Action f =()=> Method(); f();' –
也可能根据你建立的配置以及做了哪些优化......并且如果有内容被内联了,它们可能会有不同的工作方式......如果使用了任何内容......使用起来相当麻烦。 – Maslow
升级到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的中提到的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时遇到很多(性能)问题,例如... – eFloh
是的,我注意到了这是困难的方式...... :)我们的一个构建服务器无法升级,所以我们被困住了。我现在所做的是检查传入文件和成员信息。如果它是通过调用者属性输入的,我很高兴,但如果没有,我可以回退到旧时尚的StackTrace查找。这样我就可以使用正确的方法签名并获得预期的信息。当我们的服务器在一两个月内升级时,我会自动获得性能提升。 –
您能否指定它是否适用于asp.net或winforms,以便您可以获得更多帮助? :) –
我不确定是否有任何使用这种粒度反射的东西本身可以称为“高效”。 –
会像[PostSharp](http://www.sharpcrafters.com/)帮助你吗? –