2014-06-24 69 views
-1

如何獲得class-namecaller info attributes獲取類名

I strongly say a no使用反射記錄類名稱。

之所以能夠使用[CallerMemberName]象下面這樣獲得方法名稱:

 private void Log(string logMessage, [CallerMemberName]string callerName = null) 
     { 
      if (logger.IsDebugEnabled) 
      { 
       logger.DebugFormat("Executing Method = {1};{0}", logMessage, callerName); 
      } 
     } 

如何記錄class name這裏使用來電信息屬性

回答

3

你不能在那裏沒有可用的屬性。但是因爲Log是私有的,所以外部類不能調用這個函數,所以你已經知道哪個類調用了它。

public SomeClass 
{ 

    //(snip) 

    private void Log(string logMessage, [CallerMemberName]string callerName = null) 
    { 

     if (logger.IsDebugEnabled) 
     { 
      string className = typeof(SomeClass).Name; 

      logger.DebugFormat("Executing Method = {1};{2}.{0}", logMessage, callerName, className); 
     } 
    } 
} 
5

首先,該方法是私有的所以只有當前類會使用它,在這種情況下,這可以通過使用typeof(T).FullNametypeof(T).Name財產被發現。

什麼,你也可以嘗試這裏是要找出從堆棧幀編程這將適用於其他類,如果該方法是公開,類名,如下所示:

private void Log(string logMessage) 
{ 
    StackFrame frame = new StackFrame(1, false); 
    MethodBase method = frame.GetMethod(); 
    Type declaringType = method.DeclaringType; 

    // Log declaringType.FullName or other property 
} 

你可以找到更多信息在StackFrame上here和MethodBase here

另一種方法,你可以做到這一點有一個方法記錄的類型參數,並傳入你想記錄的類型,但該方法需要是公開的如果是從本課以外撥打:

public void Log(string logMessage, Type classType) 
{ 
    // Log message and class name 
} 

希望這會有所幫助。

+0

當使用沒有附加調試器的發行版時,'StackFrame'不可靠。像方法內聯這樣的東西可以使它看起來像代碼存在於你認爲它存在的地方。 –

+0

確實如此,它需要設置爲NoInlining才能可靠。我忘了這一點 - 謝謝。 –