如何知道调用者类 C# [重复]

Posted

技术标签:

【中文标题】如何知道调用者类 C# [重复]【英文标题】:How to know caller class C# [duplicate] 【发布时间】:2019-08-10 17:51:21 【问题描述】:

我有以下类结构。 A 类是从 B 类和 C 类的构造函数中调用的。

Class A

    A()


Class B

    B()
    
        A();
    


Class C

    C()
    
        A();
    

有什么方法可以让我知道对 A() 的调用是来自 B() 还是 C()? 我不想在构造函数中传递任何对象。

【问题讨论】:

可能会有所帮助:***.com/a/1375429/6299857 不是直接的。让 A 的行为依赖于使用它的类可能是不好的做法——下次你想从一个完全不同的类中使用 A 时,你会感到惊讶。最好通过参数将所有输入传递给构造函数,这样 A 的工作原理就很明显,并且可以很容易地被其他类使用(可重用性!)。 【参考方案1】:

您可以使用CallerMemberNameAttribute 获取来电者姓名。请查看here 中的以下示例。希望这会有所帮助。

public void DoProcessing()

    TraceMessage("Something happened.");


public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)

    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);


// Sample Output:
//  message: Something happened.
//  member name: DoProcessing
//  source file path: c:\Visual Studio Projects\CallerInfoCS\CallerInfoCS\Form1.cs
//  source line number: 31

【讨论】:

【参考方案2】:

这对我有用

var mth = new StackTrace().GetFrame(1).GetMethod();
var cls = mth.ReflectedType.Name;

【讨论】:

【参考方案3】:

您需要 CallerMemberNameAttributeCallerFilePathAttribute。 更多细节请参考微软文档 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/caller-information

public class FirstClass

     public string Run([CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "")
    
        return $"CallerMemberName is memberName. Calling from sourceFilePath";
    


public class SecondClass

    public string CallFirstClass()
    
        var firstClass = new FirstClass();
        return firstClass.Run();
    

CallFirstClass() 中的输出是这样的

CallerMemberName is CallFirstClass. Calling from D:\Development\WpfApp1\WpfApp1\SecondClass.cs

【讨论】:

以上是关于如何知道调用者类 C# [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 COLORREF 中的所有数据返回给 C# 中的调用者

如何从http调用获取调用者信息到c#中的另一个api

你如何找到调用者函数? [复制]

使用rpcgen时,调用者如何找到被调用者?

如何在 ruby​​ 中找到调用者类?

Typescript - 获取方法调用者的类