当前位置:  开发笔记 > 编程语言 > 正文

我如何在C#中获取调用方法

如何解决《我如何在C#中获取调用方法》经验,为你挑选了2个好方法。

来自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编译器可以优化代码,因此名称可能不同. (7认同)

这就是(1)的用途.您必须使用[MethodImpl(MethodImplOptions.NoInlining)]来确保您的方法不被内联. (5认同)

是的,但是应该避免出于调试或记录之外的任何原因提取堆栈跟踪.这可能会导致糟糕的表现. (5认同)


John Saunder.. 7

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

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);
}

这样,如果你添加一个方法3,它可以以某种方式做某事,而doSomething也不会关心.



1> Andrew Rober..:

来自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编译器可以优化代码,因此名称可能不同.
这就是(1)的用途.您必须使用[MethodImpl(MethodImplOptions.NoInlining)]来确保您的方法不被内联.
是的,但是应该避免出于调试或记录之外的任何原因提取堆栈跟踪.这可能会导致糟糕的表现.

2> John Saunder..:

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

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);
}

这样,如果你添加一个方法3,它可以以某种方式做某事,而doSomething也不会关心.


您可能只想在输出某些调试信息时才这样做
@Andrey:调试等等总是一个特例.如果OP对调试感兴趣,他应该这样说.在调试(跟踪,性能检测等)之外,这不是一个好主意.
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有