在构造函数中传递类对象本身

时间:2012-04-24 18:19:27

标签: c# generics log4net

class LogUtil : ILogUtility
{
    object _classtype;
    log4net.ILog log;

    public LogUtil(object classtype)
    {
        _classtype = classtype;
        log = log4net.LogManager.GetLogger(_classtype.GetType().FullName);
    }

    public void Log(LogType logtype, string message)
    {
        Console.WriteLine("logging coming from class {0} - message {1} " , _classtype.GetType().FullName, message);
    }
}

从客户端类代码中,我按如下方式调用上面的LogUtil类:

public class TestCode
{

    public void test()
    {
        LogUtil logutil = new LogUtil(this);

    }

}

在LogUtil构造函数中,我希望AVOID传入 object classtype。 我想传递我可以传递给GetLogger方法的客户端类对象。 GetLogger方法需要知道哪个类实例化了LogUtil类。

我现在的方式,我可以传入整数变量类类型,它会工作。我想避免它。

我该怎么做?在这种情况下如何使用泛型方法?

4 个答案:

答案 0 :(得分:3)

这是你想要的吗?

class LogUtil<T> : ILogUtility
{
    log4net.ILog log;

    public LogUtil()
    {
        log = log4net.LogManager.GetLogger(typeof(T).FullName);
    }

    public void Log(LogType logtype, string message)
    {
        Console.WriteLine("logging coming from class {0} - message {1}", typeof(T).FullName, message);
    }
}

然后您可以像这样使用它:

LogUtil<TestCode> logutil = new LogUtil<TestCode>();

答案 1 :(得分:2)

如果您使用方法级泛型,而不是类级泛型(或者更确切地说,除此之外),您可以让类型推断使您更容易。

class LogUtil<T> : ILogUtility
{
    log4net.ILog log;

    public LogUtil<T>()
    {
        log = log4net.LogManager.GetLogger(typeof(T));
    }

    public void Log(LogType logtype, string message)
    {
        Console.WriteLine("logging coming from class {0} - message {1} " , typeof(T).FullName, message);
    }

    public static LogUtil<NewType> Create<NewType>(NewType instance)
    {
      return new LogUtil<NewType>();
    }
}

public class TestCode
{
    public void test()
    {
        var logutil = LogUtil.Create(this);
    }
}

答案 2 :(得分:1)

我将其更改为:

class LogUtility : ILogUtility
{
    private Type classType;
    public LogUtil(object o)
        : this(o.GetType())
    {
    }

    public LogUtil(Type t)
    {
        this.classType = t;
    }

    public static LogUtil Create<T>()
    {
        return new LogUtil(typeof(T));
    }

    public void Log(string message)
    {
        Console.WriteLine("logging coming from class {0} - message {1} " , this.classType, message);
    }
}

答案 3 :(得分:0)

请修改LogUtil类,如下所示。

class LogUtil : ILogUtility
{
    Type _classtype;
    log4net.ILog log;

    public LogUtil(Type classtype)
    {
        _classtype = classtype;
        log = log4net.LogManager.GetLogger(_classtype.FullName);
    }

    public void Log(LogType logtype, string message)
    {
        Console.WriteLine("logging coming from class {0} - message {1} " , _classtype.FullName, message);
    }
}

客户端代码应如下所示

public class TestCode
{

    public void test()
    {
        LogUtil logutil = new LogUtil(GetType());

    }

}