2013-12-23 38 views
1

我正在使用log4net,並且想簡化使用。現在,在每節課我使用日誌記錄(這幾乎是所有的所有類),我必須寫:通過繼承類中的聲明獲取當前類

public class MyClass 
{ 
    public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    try 
    { 
     // do something 
    } 
    catch(Exception ex) 
    { 
     log.Error("Problem doing something", ex); 
    } 
} 

我真的很想做的就是把第一個聲明在另一個類,我可以只要繼承我需要記錄:

public class MyClass : Logging 
{ 
    try 
    { 
     // do something 
    } 
    catch(Exception ex) 
    { 
     log.Error("Problem doing something", ex); 
    } 
} 

public class Logging 
{ 
    public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
} 

但是,如果我這樣做,問題是

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 

...最終拿起類名登錄,這是沒有良好的日誌。我怎樣才能獲取繼承日誌類的類的類名?

謝謝!

+0

我想你不應該使用繼承,但爲您的問題組成。 – Rafa

+1

@Anders:使用'和'靜態method'而不是靜態class' ....爲'@ Yevgeniy.Chernobrivets'已經回答了.. – Moumit

回答

4

如果你繼承日誌類的所有類,那麼你將無法從任何其他類繼承的類,並創建繼承結構,因爲C#不支持多重繼承。你真的需要使用組合而不是繼承。

您可以通過創建靜態輔助類簡化爲您記錄來電:

public static class LoggerHelper 
{ 
    public static void WriteError(string message,Exception ex, Type type) 
    { 
     var log = log4net.LogManager.GetLogger(type); 
     log.Error(message, ex); 
    } 
} 

然後在你的類,你會這樣稱呼它:

public class MyClass 
{ 
    try 
    { 
     // do something 
    } 
    catch(Exception ex) 
    { 
     LoggerHelper.WriteError("Problem doing something", ex, this.GetType()); 
    } 
} 
+0

謝謝 - 很好的解決方案。你是對的(就像別人也指出的那樣),遺傳是沒有意義的。 – Anders

+0

???靜態類中的非靜態方法?方法中的公共靜態局部變量? – sgmoore

+0

對不起,修好了。感謝您的評論。 –

0

所以你會做所有的類都是從Logging繼承? 繼承並不意味着代碼重用,它意味着表示兩個域實體之間的「是一種」關係。不要濫用它。

你需要的是組成。

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 
} 

MyClass一個記錄器,它不是的記錄器。

+0

謝謝 - 採取點。你展示了與我已有的解決方案相同的解決方案。只是認爲有一個更乾淨的方式來做到這一點。 – Anders

+3

@Anders,如果你想讓它_cleaner_,你可能想看看「依賴注入」,然後使用一些IoC框架像溫莎城堡,並將其注入到記錄器的類。 – dcastro

0

聲明你的基類,像這樣:

public abstract class Logging 
{ 
    public readonly log4net.ILog log = log4net.LogManager.GetLogger(this.GetType()); 
} 

this.GetType()總是返回具體類型。