通过继承类中的声明获取当前类

时间:2013-12-23 07:55:12

标签: c# log4net

我正在使用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

...最终拿起了类名Logging,这对日志没有好处。如何获取它来获取使用继承的日志记录类的类的类名?

谢谢!

3 个答案:

答案 0 :(得分:4)

如果从Logging类继承所有类,那么您将无法从任何其他类继承类并创建继承结构,因为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());
    }
 }

答案 1 :(得分:0)

所以你要让你的所有课程继承自Logging? 继承不是代码重用,它意味着表示两个域实体之间的“是一种”关系。不要滥用它。

你需要的是作文。

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

MyClass 记录器,不是记录器。

答案 2 :(得分:0)

像这样声明你的基类:

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

this.GetType()将始终返回具体类型。