2009-02-16 60 views
21

内打印类名是否有可能从一个静态函数内打印类的名字?C#从静态函数

e.g ...

public class foo 
{ 

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

} 

回答

20
Console.WriteLine(new StackFrame().GetMethod().DeclaringType); 
+4

正如@Jamezor指出,这可能是一个性能噩梦。 干杯 – systemkern 2015-01-07 06:25:57

11

虽然StackTrace的回答是正确的,但它们确实有开销。如果您只是想要改变名称的安全性,请考虑typeof(foo).Name。由于静态方法不能是虚拟的,所以通常应该很好。

+0

这是一个很好的观点。显然,如果你控制方法,那么你控制类的名称,所以整个事情有点学术。 – 2009-02-16 09:02:44

+0

所有我用这为是登录异常行为,这样我就可以使用堆栈跟踪方法执行此日志记录活动后,将(可能)停止的开销生活。 – 2009-02-16 09:24:49

6

A(清洁剂,IMO)的替代(如地狱依然很慢,如果我看到这个在生产代码库我会畏缩):

顺便说一句,如果你这样做了记录,一些日志框架(如log4net)有内置的能力。是的,他们在文档中警告你这是一个潜在的性能噩梦。

-3

因为静态方法不能继承,当你写的方法的类名称将知道你。为什么不直接硬编码呢?

44

你有三种选择,以获得在静态函数工作的YourClass类型(因此名称):

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

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

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


如果使用typeof(YourClass)是不可取的,那么MethodBase.GetCurrentMethod().DeclaringType绝对是最好的选择。