2015-10-29 29 views
3

有沒有一種方法可以讓構造函數知道在實例f構造的哪個類型中,該對象是在內部構造的?例如,如果你查看下面的代碼,類型是否可以放在記錄器類中的反射的某個地方,告訴實例的創建位置?而不是硬編碼的信息。C#的構造函數和構造對象的類型

public class MyCollection 
{ 
    private static readonly ILog logger = LogManager.GetLogger("Entities : MyCollection"); 
} 

相反,做事情的地方,我可以只叫

LogManager.GetLogger(); 

和LOG日誌管理中,我會是什麼類型它是內初始化的構造函數中知道嗎?這樣它可以一般使用,並在每個類實例上。

+0

它只需要類型名稱?你將如何處理構造函數中的類型?施工後,根據創建它的類型,記錄器的做法會有所不同? – CoderDennis

+1

NLog的'LogManager.GetCurrentClassLogger()'確實如此(你是否使用NLog?:P),檢查它的[源代碼(在LogManager.GetClassFullName()方法中定義)](https://github.com/NLog/ NLog/blob/master/src/NLog/LogManager.cs#L379),它使用Reflection獲取調用者的名稱。 – KurzedMetal

+2

您應該使用System.Reflection – billybob

回答

3

您可以定義Logger構造函數以使其具有參數(Object obj)並由新Logger(this)創建它。

然後,您可以使用GetType()。Name來確定對象的類型。

+0

偉大的想法,我雖然這一點。想知道是否有一些我不知道的深藏不露的財產,但這是一個好方法。謝謝。 – Casey

1

這裏有兩種選擇:

  • 使用Environment.StackTrace。這會給你完整的調用堆棧(除非它被優化了,我猜)。
  • 通行證this的方法:

對於後者,你可以創建一個擴展方法:

public static class MyLogger 
{ 
    public static void Log(this object o, string format, params object[] par) 
    { 
     string typeName = o.GetType().Name; 
     string msg = string.Format(format, par); 
     // Pass to logger 
    } 
} 

使用這樣的:

this.Log("foo {0}", 12); 

注:

Ther e已經有很多優秀的.NET記錄器可用。我寧願使用其中的一個,而不是自己創建一個,因爲在某些時候,你會碰到併發問題和類似的東西。

+0

是的,我們目前正在起訴log4net。我只是想知道,並完全忽略了明顯的日誌(這個),然後使用反射來獲得我所需要的。感謝大家。 – Casey

2

避免硬編碼這樣的名稱,但也避免使用反射的另一種選擇是使用新的C#6 nameof(MyCollection)語法,它將以重命名後不會出現的名稱"MyCollection"

這不完全是你要求的,但它是一個乾淨的,重構安全的,有效的方式將名稱傳遞給這樣的靜態記錄器。

+0

不錯,謝謝。不知道「nameof」。雖然我想要更多的控制對象,那麼只是類型的名稱。 – Casey