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();