Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中获取调用函数的名称?_C# - Fatal编程技术网

如何在C#中获取调用函数的名称?

如何在C#中获取调用函数的名称?,c#,C#,我需要在C#中获取调用函数的名称。我读过stackframe方法,但到处都说它不可靠,影响性能 但我需要它用于生产。我正在编写一个自定义跟踪程序,它将记录调用跟踪的方法的名称 有人能帮我找到一个有效的方法来获取调用函数名吗?我正在使用Visual Studio 2010。您可以执行以下操作: var stackTrace = new StackTrace(); var name = stackTrace.GetFrame(1).GetMethod().Name; 它可以与框架/语言的任何版

我需要在C#中获取调用函数的名称。我读过stackframe方法,但到处都说它不可靠,影响性能

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


有人能帮我找到一个有效的方法来获取调用函数名吗?我正在使用Visual Studio 2010。

您可以执行以下操作:

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

它可以与框架/语言的任何版本一起使用。

您可以执行以下操作:

 var stackTrace = new StackTrace();
 var name = stackTrace.GetFrame(1).GetMethod().Name;
并且它可以与框架/语言的任何版本一起工作。

升级到c#5并使用
CallerMemberName

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

c#5的其他优点

升级到c#5并使用
CallerMemberName

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

c#5的其他优点

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

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



请指定它是用于asp.net还是winforms,以便获得更多帮助我不确定任何使用这种颗粒反射的东西本身是否可以被称为“有效的”。需要帮助吗?stacktrace对我来说非常可靠,如果这是您需要做的,那么您只需要接受反射对性能的影响。@HanletEscaño这是针对后端服务的。您能指定它是针对asp.net还是winforms,以便获得更多帮助吗?:)我不确定使用这种粒度反射的任何东西本身是否可以称为“高效”。您需要什么帮助吗?stacktrace对我来说非常可靠,如果这是您需要做的,那么您只需要吸收反射的性能影响。@HanletEscaño这是用于后端服务的。哇,我不知道C#5存在。最后,这是Jon Skeet版吗?@UweKeim你没听过VS2012吗?:(这不是我的决定。@LB在stackoverflow的某个地方看到了这些,但它只适用于.NET4.5及以上版本:(@shobhit是的,版本编号很奇怪,c#5附带了.Net 4.5Wow,我不知道c#5的存在。这是Jon Skeet版本吗,最后?@UweKeim你没听过VS2012吗?:(这不是我的决定。@LB在stackoverflow的某个地方看到了这些,但它只适用于.NET4.5及以上版本:(@shobhit是的,版本编号很奇怪,c#5随.Net 4.5一起提供,也可能根据您内置的配置和进行的优化而工作不同…如果任何东西都是内联的…使用起来相当痛苦。也可能根据您内置的配置和进行的优化而工作不同…如果有任何东西是我的NLINE…使用起来很痛苦。太棒了!!这很有魅力。它使我们当前的项目免于升级所有构建服务的麻烦。谢谢!@Jakob:但请记住:构建代理必须使用vs2012,否则方法参数将始终为空,这会使您获得很多(性能)例如,在INotifyPropertyChanged实现中使用时会出现问题……是的,我注意到这很困难……:)我们的一个生成服务器无法升级,因此我们被卡住了。我现在要做的是检查传入的文件和成员信息。如果它是通过调用方属性输入的,我很高兴,但如果不是,我可以回退到老式的StackTrace查找。这样我就可以使用正确的方法签名,并获得预期的信息。当您的服务器将在一两个月内升级,我将自动获得性能提升。太棒了!!这很有魅力。它使我们当前的项目在升级所有构建服务时免去了很多麻烦。谢谢!@Jakob:但请记住:构建代理必须使用vs2012,否则方法参数将始终为null,这会让您感到非常困惑(性能)例如,在INotifyPropertyChanged实现中使用时会出现问题……是的,我很难注意到这一点……:)我们的一个生成服务器无法升级,因此我们被卡住了。我现在要做的是检查传入的文件和成员信息。如果它是通过调用方属性输入的,我很高兴,但如果不是,我可以回退到老式的StackTrace查找。这样我就可以使用正确的方法签名,并获得预期的信息。当您的服务器在一两个月内升级,我将自动获得性能提升。