显示某个对象的事件历史
本文关键字:事件 历史 对象 显示 | 更新日期: 2023-09-27 17:54:54
假设我有一个Class1 obj1 = new Class1()
。Class1有许多不同的项目。我想知道什么事件以及什么时候发生的,但我不想为这个对象的每个事件创建事件处理程序。我该怎么做呢?
我想看到的输出示例:
13:04:29 Obj1.OnEvent1
13:04:31 Obj1.OnEvent2
13:04:32 Obj1.OnEvent3
13:04:35 Obj1.OnEvent2
......................
注::我使用的是Visual Studio 2012 Ultimate.
您必须使用,例如,语义日志应用程序块来检测您的代码。
如果您遵循protected virtual
OnEvent
方法触发*Event*
事件的既定实践,您将发现实际事件是OnEvent
方法实际上是真实事件,而*Event*
. net事件只是其他人可以订阅的通知。你想记录事件而不是事件订阅。
你可以订阅事件并记录它,但你很快就会发现你想记录的不仅仅是这些事件。
如果您的eventandler的委托类型是统一的,您可以遍历从该类型获得的事件并将日志逻辑附加到事件上。我使用一个日志记录器类,其方法为订阅和退订(此处未实现)
记录器
public class EventLogger
{
public void Subscribe<T>(T obj)
{
// get the type to iterate over the EventInfo's
var type = typeof (T);
foreach (var eve in type.GetEvents())
{
EventInfo info = eve;
// attach our logging logic
eve.AddEventHandler(obj,
new EventHandler((sender, args) =>
{
Console.WriteLine(
"{0} {1}.{2}",
DateTime.Now,
obj,
info.Name);
}));
}
}
public void Unsubscribe()
{
//todo unsubscribe
}
}
Demo类
public class Class1
{
// public delegate void MyDelegate(string key, DateTime date, int value);
public event EventHandler Foo;
public event EventHandler Bar;
// public event MyDelegate Cancel;
public void Raise()
{
this.Bar(null, EventArgs.Empty);
// this.Cancel(null, DateTime.Now, 4);
}
}
使用var c = new Class1();
c.Bar += (sender, eventArgs) => { Console.WriteLine("bar"); };
// have our logger ready
var logger = new EventLogger();
// attach logging to a specific instance
logger.Subscribe(c);
// raise our events
c.Raise();
注意,我们只能处理EventHandler类型的委托。(我注释了委托MyDelegate,因为这会破坏这个简单的实现)。如果您有使用不同委托的事件,则需要在Subscribe
方法中构建一个switch语句来处理每种不同类型,或者实现一个方法来生成可以处理委托的动态程序集,如下所示。