Answers:
我想你有原因。我这样做是为了不必担心类名,只需将样板代码复制并粘贴到新类中即可。
有关官方答案,请参见:如何在静态块中获得类的全名?在log4net常见问题上
我是NLog用户,通常可以归结为:
var _logger = LogManager.GetCurrentClassLogger();
您需要在Log4Net中进行反射似乎有点奇怪,所以我看了一下NLog源代码,瞧瞧,这就是它们为您所做的:
[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
string loggerName;
Type declaringType;
int framesToSkip = 1;
do
{
#if SILVERLIGHT
StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
StackFrame frame = new StackFrame(framesToSkip, false);
#endif
var method = frame.GetMethod();
declaringType = method.DeclaringType;
if (declaringType == null)
{
loggerName = method.Name;
break;
}
framesToSkip++;
loggerName = declaringType.FullName;
} while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
return globalFactory.GetLogger(loggerName);
}
我想我会为Log4Net写类似的东西作为扩展或静态方法,而不是将反射粘贴为锅炉代码的一部分:)
如您所说-这很方便,因为您可以在不知道类名的情况下在方法中创建记录器(我知道这很简单),但是允许您在类之间剪切和粘贴方法而不必重命名调用。