0
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 构造函数中,我想避免传入对象类类型。我想传入可以传递给 GetLogger 方法的客户端类对象。GetLogger 方法需要知道哪个类实例化了 LogUtil 类。

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

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

4

4 回答 4

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>();
于 2012-04-24T18:24:37.843 回答
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);
    }
}
于 2012-04-24T18:29:50.370 回答
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);
    }
}
于 2012-04-24T18:32:26.527 回答
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());

    }

}
于 2012-04-24T18:25:58.607 回答