就像标题所说:反射可以为您提供当前正在执行的方法的名称.
由于海森堡的问题,我倾向于不猜.如何在不改变当前方法的情况下调用一种方法来告诉您当前的方法?但是我希望有人可以在那里证明我的错.
更新:
最终结果
我了解了MethodBase.GetCurrentMethod().我还了解到,我不仅可以创建堆栈跟踪,而且如果需要,我只能创建我需要的确切帧.
要在属性中使用它,只需使用.Substring(4)删除'set_'或'get_'.
我有一种独特的情况.我一直在开发一个用于发送电子邮件的开源库.在这个库中,我需要一种可靠的方法来获取调用方法.我StackTrace通过分析其中的StackFrame对象来做到这一点.这在调试模式项目中没有问题,其中优化已关闭.
当我切换到启用优化的发布模式时,会出现问题.堆栈跟踪如下所示:
> FindActionName at offset 66 in file:line:column <filename unknown>:0:0
> Email at offset 296 in file:line:column <filename unknown>:0:0
> CallingEmailFromRealControllerShouldFindMailersActionName at offset 184
in file:line:column <filename unknown>:0:0
> _InvokeMethodFast at offset 0 in file:line:column <filename unknown>:0:0
> InvokeMethodFast at offset 152 in file:line:column <filename unknown>:0:0
...
Run Code Online (Sandbox Code Playgroud)
这是从失败的单元测试中获得的.在这个跟踪的第3行中,我应该看到一个被称为TestEmail在其他地方定义的方法,但我相信JITter正在内联它.我已经读过你可以通过使方法虚拟来防止内联,但这不起作用.有没有人知道一种可靠的方法来防止方法内联,所以你的方法会出现在堆栈跟踪中?
我想在dotnet核心应用程序中获取当前正在执行的方法的名称.
有很多关于如何使用常规c#执行此操作的示例,例如
然而,这两种方法的api似乎还没有核心(参见https://github.com/dotnet/corefx/issues/1420)
有没有其他方法可以在.net核心中获取执行方法名称?
我正在浏览大约 70 万行代码。大量的接口实现和DI使用。我试图找出从哪里调用特定方法,因此我尝试使用[CallerMemberName].
我在谷歌等上看到的所有例子都是这样的:
public void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
Run Code Online (Sandbox Code Playgroud)
可选参数用于获取信息。我的问题是这个方法是接口实现的一部分。因此,当我更改方法签名时,编译器会对我大喊大叫。
任何有关如何使接口方法发挥良好作用的建议[CallerMembername]将不胜感激。