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 に答える