Я хочу вызвать 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
).