2011-06-17 96 views
2

如何從靜態類中調用通過通用動態類型的方法。 這裏是我的靜態類:調用靜態類的方法傳遞動態變量的類型與泛型

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的在通用的,因爲這個對象的類型是動態。

+3

「一般動態類型」的含義並不完全清楚。 – 2011-06-17 13:06:55

回答

4

我想打電話給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)。