首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过接口方法使用CallerMemberName

如何通过接口方法使用CallerMemberName
EN

Stack Overflow用户
提问于 2019-09-20 08:38:13
回答 2查看 1.1K关注 0票数 3

我正在浏览大约70万行代码。大量的接口实现和DI用法。我试图找出一个特定的方法是从哪里调用的,因此我尝试使用[CallerMemberName]

我在google等网站上看到的所有例子都是这样的:

代码语言:javascript
复制
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]配合得很好的建议,我们将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2020-08-18 23:17:49

有一个类似的问题-我发现我可以添加CallerMemberName到接口方法,如下所示。它确实会更改实现类的签名,但不会更改调用代码的签名-如果这有意义的话!

如果这是该方法在接口中的当前签名

代码语言:javascript
复制
void TraceMessage(string message);

按如下方式更改

代码语言:javascript
复制
void TraceMessage(string message,
    [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
    [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
    [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0);

更新实现接口的类中的方法

代码语言:javascript
复制
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‘参数,并且其他参数仍然会被拾取,所以不需要重构所有调用代码

代码语言:javascript
复制
TraceMessage("Testing");

(为简洁起见,添加)

代码语言:javascript
复制
using System.Runtime.CompilerServices;
票数 3
EN

Stack Overflow用户

发布于 2019-09-20 09:35:27

您可以在不更改任何签名的情况下以不同的方式获取呼叫者姓名,请尝试使用this solution

代码语言:javascript
复制
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这样的方面。你需要实现一个方面(拦截器)并在容器中注册它,here就是一个缓存拦截器的例子。

如果您不使用IoC,您仍然可以使用面向方面程序设计方法,并向您感兴趣的方法添加特定的方面。PostSharp可以做到这一点,但它不是一个免费的工具,here是一些替代工具。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58020355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档