[英]How to use CallerMemberName with an interface method
我正在浏览大约 700K 行代码。 大量的接口实现和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)
其中可选参数用于获取信息。 我的问题是这个方法是接口实现的一部分。 因此,当我更改方法签名时,编译器会对我大喊大叫。
任何有关如何使接口方法与[CallerMembername]
配合使用的建议将不胜感激。
您可以在不更改任何签名的情况下以不同的方式获取来电者姓名,试试这个解决方案
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 。 您需要实现一个方面(拦截器)并将其注册到容器中, 这是一个使用缓存拦截器的示例。
如果您不使用 IoC,您仍然可以使用 AOP 方法并为您感兴趣的方法添加某个方面。 PostSharp可以做到这一点,但它不是免费工具, 这里有一些替代方案。
有一个类似的问题 - 发现我可以将 CallerMemberName 添加到接口方法中,如下所示。 它确实更改了实现 class 的签名,但不会更改调用代码 - 如果这有意义的话!
如果这是接口中方法的当前签名
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);
更新实现接口的class中的方法
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
}
这仍然可以使用原始签名仅使用“消息”参数调用,其他参数仍将被拾取,因此无需重构所有调用代码
TraceMessage("Testing");
(为简洁添加)
using System.Runtime.CompilerServices;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.