2012-08-23 53 views
1

我需要在C#中获取调用函数的名称。我阅读了关于栈帧方法,但是到处都说它不可靠并且损害了性能。如何获取C#中调用函数的名称?

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

有人可以请一个有效的方法来获得调用函数名称的帮助吗?我使用Visual Studio 2010中

+0

您能否指定它是否适用于asp.net或winforms,以便您可以获得更多帮助? :) –

+3

我不确定是否有任何使用这种粒度反射的东西本身可以称为“高效”。 –

+1

会像[PostSharp](http://www.sharpcrafters.com/)帮助你吗? –

回答

5

你可以这样做:

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

,并将其与框架/语言的任何版本。

+1

这不适用于'Action f =()=> Method(); f();' –

+0

也可能根据你建立的配置以及做了哪些优化......并且如果有内容被内联了,它们可能会有不同的工作方式......如果使用了任何内容......使用起来相当麻烦。 – Maslow

10

升级到C#5,使用CallerMemberName

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

编辑

还有一些不错的使用C#的东西5

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

嗯有点太激烈:) –

+0

哇,我不知道C#5存在。这是Jon Skeet的版本吗? –

+0

@UweKeim你没听说过VS2012吗? –

8

您可以使用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 
    { 
    } 
} 
+0

非常好!这像一个魅力。它将我们当前的项目从升级所有构建服务的许多麻烦中拯救出来。谢谢! –

+0

@Jakob:但请记住:构建代理必须使用vs2012,否则方法参数将始终为空,使您在使用INotifyPropertyChanged-Implementations时遇到很多(性能)问题,例如... – eFloh

+0

是的,我注意到了这是困难的方式...... :)我们的一个构建服务器无法升级,所以我们被困住了。我现在所做的是检查传入文件和成员信息。如果它是通过调用者属性输入的,我很高兴,但如果没有,我可以回退到旧时尚的StackTrace查找。这样我就可以使用正确的方法签名并获得预期的信息。当我们的服务器在一两个月内升级时,我会自动获得性能提升。 –

相关问题