显示某个对象的事件历史

本文关键字:事件 历史 对象 显示 | 更新日期: 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语句来处理每种不同类型,或者实现一个方法来生成可以处理委托的动态程序集,如下所示。