繁体   English   中英

如何通过接口方法使用 CallerMemberName

[英]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.InterceptionNinject.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM