目前我有一个函数CreateLog()用于在构造实例的类之后创建一个带有名称的log4net日志.通常用于:
class MessageReceiver { protected ILog Log = Util.CreateLog(); ... }
如果我们删除了大量的错误处理,实现归结为:[编辑:请在本文中进一步阅读更长版本的CreateLog.]
public ILog CreateLog() { System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(1); System.Reflection.MethodBase method = stackFrame.GetMethod(); return CreateLogWithName(method.DeclaringType.FullName); }
问题是,如果我们将MessageReceiver置于子类中,则日志仍将从MessageReceiver获取其名称,因为这是调用CreateLog的方法(构造函数)的声明类.
class IMReceiver : MessageReceiver { ... } class EmailReceiver : MessageReceiver { ... }
这两个类的实例将获得与名称"的messageReceiver"日志,而我想他们是赐名"IMReceiver"和"EmailReceiver".
我知道这很容易通过调用CreateLog时,因为对对象对GetType()方法,我想要做什么创作传递一个参考对象来完成(并完成).
有一些小的理由不喜欢不添加参数,个人感到不安,因为没有找到没有额外参数的解决方案.
是否有人可以告诉我如何实现零参数CreateLog()从子类而不是声明类获取名称?
编辑:
CreateLog函数比上面提到的更多.每个实例有一个日志的原因是能够在日志文件中的不同实例之间有所不同.这由CreateLog/CreateLogWithName对强制执行.
扩展CreateLog()的功能以激发其存在.
public ILog CreateLog() { System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(1); System.Reflection.MethodBase method = stackFrame.GetMethod(); Type type = method.DeclaringType; if (method.IsStatic) { return CreateLogWithName(type.FullName); } else { return CreateLogWithName(type.FullName + "-" + GetAndInstanceCountFor(type)); } }
我更喜欢编写ILog Log = Util.CreateLog(); 而不是每当我写一个新类时,从其他文件中复制一些长的神秘线.我知道,在Util.CreateLog使用的反射不能保证工作,虽然 - 是System.Reflection.MethodBase.GetCurrentMethod()保证工作?