C# 显示某个对象的事件历史记录
假设我有C# 显示某个对象的事件历史记录,c#,.net,events,C#,.net,Events,假设我有Class1 obj1=new Class1()。1班有许多不同的项目。我想知道什么事件以及什么时候发生,但我不想为这个对象的每个事件创建事件处理程序。我怎么做 我希望看到的示例输出: 13:04:29 Obj1.OnEvent1 13:04:31 Obj1.OnEvent2 13:04:32 Obj1.OnEvent3 13:04:35 Obj1.OnEvent2 ...................... 注意:我正在使用Visual Studio 2012 Ultimate。如
Class1 obj1=new Class1()
。1班有许多不同的项目。我想知道什么事件以及什么时候发生,但我不想为这个对象的每个事件创建事件处理程序。我怎么做
我希望看到的示例输出:
13:04:29 Obj1.OnEvent1
13:04:31 Obj1.OnEvent2
13:04:32 Obj1.OnEvent3
13:04:35 Obj1.OnEvent2
......................
注意:我正在使用Visual Studio 2012 Ultimate。如果eventhandler的委托类型是统一的,则可以迭代从该类型获得的事件,并将日志逻辑附加到事件。我使用一个logger类和Subscibe和Unsubscribe方法(此处未实现) 记录器 用法
请注意,我们只能处理EventHandler类型的委托。(我对委托MyDelegate进行了注释,因为这会破坏这个简单的实现)。如果有使用不同委托的事件,则需要在
Subscribe
方法中生成一个switch语句来处理每个不同的类型,或者实现一个方法来生成一个可以处理委托的动态程序集,如图所示 您必须使用,例如
如果您遵循使用受保护的虚拟OnEvent
方法的既定实践,则会触发*事件*
事件,您会发现实际事件是OnEvent
方法实际上是真实事件,*事件*
。NET事件只是其他人可以订阅的通知。您希望记录事件,而不是事件订阅
您可以订阅一些事件并将其记录下来,但您很快就会发现,您需要记录的不仅仅是这些事件。您想了解哪些上下文?在执行期间?作为持久化的日志?当出现问题时?是的,但非常复杂,因为每个事件都可能不同(其他参数等)。您是否考虑过使用反射来查询对象的事件、附加到事件并根据需要记录?
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
}
}
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();