【问题标题】:c# print the class name from within a static functionc# 从静态函数中打印类名
【发布时间】:2010-10-07 20:20:16
【问题描述】:

是否可以从静态函数中打印类名?

例如...

public class foo
{

    static void printName()
    {
        // Print the class name e.g. foo
    }

}

【问题讨论】:

标签: c# static


【解决方案1】:

从 C# 6.0 开始,有一种更简单、更快捷的方法可以将类型名称作为字符串获取,而无需在代码中键入字符串文字,使用 nameof 关键字:

public class Foo
{
    static void PrintName()
    {
        string className = nameof(Foo);
        ...
    }
}

【讨论】:

    【解决方案2】:

    您有三个选项来获取在静态函数中工作的YourClass 的类型(以及名称):

    1. typeof(YourClass) - 快速(0.043 微秒)

    2. MethodBase.GetCurrentMethod().DeclaringType - 慢(2.3 微秒)

    3. new StackFrame().GetMethod().DeclaringType - 最慢(17.2 微秒)


    如果不希望使用typeof(YourClass),那么MethodBase.GetCurrentMethod().DeclaringType 绝对是最佳选择。

    【讨论】:

      【解决方案3】:

      一个(更清洁的,IMO)替代方案(仍然慢得要命,如果我在生产代码库中看到这个我会畏缩):

      Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType);
      

      顺便说一句,如果您这样做是为了进行日志记录,一些日志记录框架(例如 log4net)具有内置功能。是的,它们在文档中警告您这是一个潜在的性能噩梦。

      【讨论】:

        【解决方案4】:

        由于静态方法不能被继承,所以当你编写方法时你会知道类名。为什么不直接硬编码呢?

        【讨论】:

        • 静态方法很难被继承,如果你想调用子类的静态方法你会很不走运
        • @systemkern - 抱歉,我不明白。即使您“通过”子类(如SubClass.BaseClassStaticMethod();)调用该方法,实际的 IL 代码仍将像您从基类调用它一样。它只是 C# 编译器的语法糖。没有办法实际上“通过子类”调用方法,因此无法从方法内部找出调用的 C# 代码是这样编写的。
        • 是的,这是真的,但是如果您调用 SubClassAA.BaseClassStaticMethod() 与调用 SubClassBB.BaseClassStaticMethod() 时,您可能希望有稍微不同的行为。这可能并不漂亮,但有时是必要的,因为您无法完全控制子类......因为“原因”
        • @systemkern - 那么,你搞砸了。你不能那样做。尝试想出其他东西,比如实例方法或扩展或额外的(类型?)参数或其他东西。无论如何,这与我写的内容有何不同?
        • 我被静态方法不能被继承的说法挂断了。
        【解决方案5】:

        虽然 StackTrace 的答案是正确的,但它们确实存在开销。如果您只是想安全地避免更改名称,请考虑typeof(foo).Name。由于静态方法不能是虚拟的,这通常应该没问题。

        【讨论】:

        • 这是一个很好的观点。显然,如果你控制了方法,那么你就控制了类名,所以整个事情有点学术。
        • 我使用它只是为了记录异常行为,因此我可以忍受使用堆栈跟踪方法的开销,因为在此记录活动之后执行将(可能)停止。
        • 如果将代码粘贴到另一个类并且您忘记了此代码,则此代码将不起作用
        • 或已移动。假设typeof(foo).Nametypeof(foo).Something 代码是更大逻辑的一部分,并且在某些时候您决定该逻辑最好在另一个类中完成。您不会注意到您需要更改它,因为代码仍会编译
        • @Louis 很多编译的东西都不对。这就是我们测试的原因。进行堆栈帧查找不是一种有效的方法。
        【解决方案6】:
        Console.WriteLine(new StackFrame().GetMethod().DeclaringType);
        

        【讨论】:

        • 正如@Jamezor 所指出的,这可能是一场性能噩梦。欢呼
        【解决方案7】:

        StackTrace 类可以做到这一点。

        【讨论】:

          猜你喜欢
          • 2019-12-10
          • 1970-01-01
          • 1970-01-01
          • 2012-09-03
          • 1970-01-01
          • 1970-01-01
          • 2014-06-08
          • 2012-10-18
          • 1970-01-01
          相关资源
          最近更新 更多