Вызовите метод из статического класса, передавая тип динамической переменной с помощью универсальных шаблонов.

Как я могу вызвать метод из статического класса, передавая тип dynamic в generic. Вот мой статический класс:

public static class Log<T>
{
    private readonly static ILog Logger = LogManager.GetLogger(typeof(T));

    public static void LogInfo(string message)
    {
        Logger.Info(message);
    }
}

Я хочу вызвать LogInfo следующим образом:

Log<myObject.GetType()>.LogInfo("Some String");

Мой вопрос о том, как передать тип myObject в Generic, потому что тип этого объекта является динамическим.


person Acaz Souza    schedule 17.06.2011    source источник
comment
Совершенно не ясно, что вы подразумеваете под передачей типа dynamic в generic.   -  person Jon Skeet    schedule 17.06.2011
comment
У вас есть интерфейс с именем ILog и класс с именем Log, который не реализует ILog. Я бы посоветовал против этого.   -  person jason    schedule 17.06.2011
comment
@ Джейсон, я рассмотрю это, спасибо ...   -  person Acaz Souza    schedule 17.06.2011
comment
@ Джейсон Что ты предлагаешь?   -  person Acaz Souza    schedule 17.06.2011


Ответы (1)


Я хочу вызвать LogInfo следующим образом:

Log<myObject.GetType()>.LogInfo("Some String");

Почему? Почему бы вам просто не сделать это:

public static class Log {
     private static readonly Dictionary<Type, ILog> loggers =
         new Dictionary<Type, ILog>();

     public static void LogInfo(Type type, string message) {
          var logger = Log.GetLoggerForType(type);
          logger.Info(message);
     }

     public static void LogInfo<T>(string message) {
          LogInfo(typeof(T), message);
     }

     private static ILog GetLoggerForType(Type type) {
          ILog logger;
          if(!loggers.TryGetValue(type, out logger)) {
               logger = LogManager.GetLogger(type);
               loggers.Add(type, logger);
          }
          return logger;
     }
}

Обратите внимание, что это не, НЕ, НЕ потокобезопасно. Я хотел донести мысль.

Затем:

Log<myObject.GetType()>.LogInfo("Some String");

можно заменить на

Log.LogInfo(myObject.GetType(), "Some String");

или вы даже можете сделать еще один шаг и добавить перегрузку, которая позволит вам сказать

Log.LogInfo(myObject, "Some String");

(просто позвоните object.GetType в LogInfo).

person jason    schedule 17.06.2011