Если вы используете C # 6 и .NET> 4.5, вы можете сделать хитрый трюк, чтобы использовать CSharpCodeProvider
:
public static class LogManager<T>
{
public static Logger GetLogger()
{
return LogManager.GetLogger(typeof(T).GetFriendlyName());
}
}
public static class TypeExtensions
{
public static string GetFriendlyName(this Type t)
{
using (var provider = new CSharpCodeProvider())
{
var typeRef = new CodeTypeReference(t);
return provider.GetTypeOutput(typeRef);
}
}
}
Затем вы можете использовать это расширение следующим образом:
var logger = LogManager<Dictionary<string, int>>.GetLogger();
logger.Info("logger name contains generic params");
И вывод будет:
2016-09-23 13:52:14.6342|INFO|System.Collections.Generic.Dictionary<string, int>|logger name contains generic params