我正在浏览大约70万行代码。大量的接口实现和DI用法。我试图找出一个特定的方法是从哪里调用的,因此我尝试使用[CallerMemberName]。
我在google等网站上看到的所有例子都是这样的:
public void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)其中可选参数用于获取信息。我的问题是这个方法是接口实现的一部分。因此,当我更改方法签名时,编译器会对我大喊大叫。
如果有任何关于如何让接口方法与[CallerMembername]配合得很好的建议,我们将不胜感激。
发布于 2020-08-18 23:17:49
有一个类似的问题-我发现我可以添加CallerMemberName到接口方法,如下所示。它确实会更改实现类的签名,但不会更改调用代码的签名-如果这有意义的话!
如果这是该方法在接口中的当前签名
void TraceMessage(string message);按如下方式更改
void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0);更新实现接口的类中的方法
public void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
// Log the params
}这仍然可以使用原始签名调用,只使用'message‘参数,并且其他参数仍然会被拾取,所以不需要重构所有调用代码
TraceMessage("Testing");(为简洁起见,添加)
using System.Runtime.CompilerServices;发布于 2019-09-20 09:35:27
您可以在不更改任何签名的情况下以不同的方式获取呼叫者姓名,请尝试使用this solution
using System.Diagnostics;
// Get call stack
StackTrace stackTrace = new StackTrace();
// Get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);这种解决方案比您正在尝试使用的编译时要慢得多,但它的侵入性要小得多。
如果性能很重要,并且您正在将DI与IoC容器一起使用,那么您可以检查它是否支持像Unity.Interception或Ninject.Extensions.Interception这样的方面。你需要实现一个方面(拦截器)并在容器中注册它,here就是一个缓存拦截器的例子。
如果您不使用IoC,您仍然可以使用面向方面程序设计方法,并向您感兴趣的方法添加特定的方面。PostSharp可以做到这一点,但它不是一个免费的工具,here是一些替代工具。
https://stackoverflow.com/questions/58020355
复制相似问题