2011-06-17 118 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)。