2009-02-16 58 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絕對是最好的選擇。