如何在 C# 中获取调用方法 [重复]

Posted

技术标签:

【中文标题】如何在 C# 中获取调用方法 [重复]【英文标题】:How I can get the calling methods in C# [duplicate] 【发布时间】:2010-09-28 12:49:03 【问题描述】:

可能重复:How can I find the method that called the current method?

我需要一种方法来知道 C# 中调用方法的名称。

例如:

private void doSomething()

// I need to know who is calling me? (method1 or method2).

// do something pursuant to who is calling you?
 

private void method1()

 doSomething();


private void method2()

 doSomething();

【问题讨论】:

什么情况下需要知道? 这闻起来像是糟糕的编程习惯,请告诉我们您为什么要这样做? ;-) 将参数传递给 doSomething() 函数,具体取决于调用它的人。 是的,这通常不是一个好主意 我可以想到一个好主意的情况——如果你有共享代码负责一些横切关注点,例如日志记录,您可能希望此信息专门用于共享代码的输出 - 我在服务调用日志记录中使用这种做法,实用程序函数为服务调用设置安全性和日志记录,并将调用函数的身份用于日志记录和检查安全访问权限 【参考方案1】:

来自http://www.csharp-examples.net/reflection-calling-method-name/

using System.Diagnostics;

// get call stack
StackTrace stackTrace = new StackTrace();

// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

【讨论】:

我认为在发布版本中你不能依赖这个,因为 jit 编译器可以优化代码,所以名称可能不同。 但是我怎样才能得到以前的方法调用。更改 GetFrame() 为您提供调用堆栈中的所有方法。 这就是 (1) 的用途。您必须使用 [MethodImpl(MethodImplOptions.NoInlining)] 来确保您的方法不会被内联。 是的,但是应避免出于调试或日志记录以外的任何原因提取堆栈跟踪。这可能会导致糟糕的性能。 性能可能更差,但就我而言(最多连续调用 150 次),我什至无法测量差异。但是,我无法充分强调 Stormenet/Hans Passant 所说的不依赖于发布版本中的这一点。我花了两天的时间寻找一个错误,然后发现了这个问题。它几乎是多云的,因为您可以添加无意义的代码来阻止内联,并且您的代码将在调试模式下工作。【参考方案2】:

您几乎肯定不想这样做。调用者永远不应该知道是谁在调用它。相反,应该将两个调用者之间的差异抽象为一个参数,并传递给被调用的方法:

private void doSomething(bool doItThisWay)

    if (doItThisWay)
    
        // Do it one way
    
    else
    
        // Do it the other way
    


private void method1()

    doSomething(true);


private void method2()

    doSomething(false);

这样,如果你添加一个method3,它可以以一种方式或另一种方式做某事,而doSomething不会在意。

【讨论】:

您可能只想在输出一些调试信息时这样做 @Andrey:调试等总是一种特殊情况。如果 OP 对调试感兴趣,他可能应该这么说。在调试(跟踪、性能检测等)之外,这不是一个好主意。 @Downvoter:这个答案有什么问题? @JohnSaunders 这不是一个正确的答案。你没有得到方法名 @John Saunders 他只是表示这更适合作为评论而不是答案,因为它没有给他原始问题的实际答案。

以上是关于如何在 C# 中获取调用方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

捕获调用异步方法C#的异常[重复]

在 C# 中,如何可靠地杀死进程树 [重复]

在 C# 中使用计时器重复对每个目录进行方法调用

使用继承的 C# 重载方法调用 [重复]

C#:在运行时获取类型参数以传递给通用方法[重复]

从另一个 C# 应用程序调用 C# 应用程序中的方法 [重复]