我目前非常需要现有应用程序的日志记录,并且无法将我期望的日志记录级别直接添加到代码中。作为一种解决方法,我很乐意在每次触发事件时完成一定数量的日志记录。
我正在考虑一个解决方案,我可以在运行时解析整个应用程序以使用事件到包装器到处理程序来包装所有事件到处理程序的绑定;并且,理想情况下,也可以在运行时解开它们。在伪代码中,这将是:
IDictionary<Event, Action<object, EventArgs>) originalBindings = ...;
public void SetWrapBindings()
{
var allBindingsToReplace = Assembly.GetAssembly().GETALLEVENTS()
.Where(eventInfo => eventInfo.GetOtherMethods().Any());
foreach(var binding in allBindingsToReplace)
{
binding.event -= binding.handler;
binding.event += HandlerWrapper;
originalBindings.Add(binding.event, binding.handler);
}
}
public static void HandlerWrapper(object o, EventArgs e)
{
// Do some logging
try
{
var handler = originalBindings.TryGetValue(/* something */);
handler.Invoke(o, e);
}
// Do more logging
}
在这一堆伪代码中,有很多步骤我无法编写,可能是因为我没有找到正确的 API 用法,但也可能是因为其中的某些操作在理论上是不可能的(在这种情况下我会喜欢知道为什么)。这些是:
- 迭代应用程序的所有事件(这可能很容易)
- 为我的字典识别一个好的键
- 在每一步,从上下文中获取相关信息
当然,将一个额外的处理程序绑定到每个现有事件(执行前/后执行例程而不真正包装处理程序)会有所帮助,但是在 try-catch 中执行真正的处理程序是一件好事。
任何部分答案仍然非常感谢