更新MFC中的视图,跟踪.NET Framework中的事件
2006-07-19 11:28:40 来源:WEB开发网核心提示: // spy on myselfspy = new EventSpy("MySpy", this);spy.SpyEvent += new SpyEventHandler(OnEventSpy);当目标对象(spyee)产生任何一种事件,EventSpy就产生一个Spy
// spy on myself
spy = new EventSpy("MySpy", this);
spy.SpyEvent += new SpyEventHandler(OnEventSpy);
当目标对象(spyee)产生任何一种事件,EventSpy就产生一个SpyEvent事件。此时,SpyEventArgs.EventName 就是事件的名字,SpyEventArgs.EventArgs 包 含原始的事件参数。如何处理这些事件是你自己的事。SpyTest 将该事件报告给诊断流。
// in main form
private void OnEventSpy(Object sender,
SpyEventArgs e)
{
Trace.WriteLine(String.Format("{0}: On{1}: {2}",
sender.GetType(), e.EventName, e.EventArgs));
}
Figure 3 示范了一个典型的运行结果。先去下载代码,自己试着运行一下——它 确实能运行!EventSpy 还有一个 DumpEvents 函数,列出所有你的目标类暴露的事件。
Figure 3 SpyTrace
如果你只是想用 EventSpy 来跟踪事件,你可以不用阅读此文,直接到 MSDN Magazine 网站下载源代码。对于那些忍不住想自己实现类似 EventSpy 功能的狂热者(祝你好运!),我下面简要概述一下 EventSpy 的工作原理。
讨论事件最终结果是为了跟踪事件,你必须动态生成一个类似 Figure 4 那样的类。在创建这个类之前,你需要为它创建一个集合和模板。System.Reflection.Emit 使用 AssemblyBuilder、ModuleBuilder、TypeBuilder、FieldBuilder、ConstructorBuilder 和 MethodBuilder 来创建你需要的任何东西。这里演示如何创建一个集合。
AssemblyName an = new AssemblyName();
an.Name = "EventSpyHelper";
AssemblyBuilder asm = AppDomain.CurrentDomain.DefineDynamicAssembly(an,
AssemblyBuilderAccess.Run);
创建模块更简单。创建这个类、字段和方法很象给每个东西取一个名字和标记那样直截了当。最难的部分是何时生成实际代码——换句话说, 也就是每个事件的容器和事件处理器。关键的类叫ILGenerator。Figure 4 演示 EventSpy 如何编写这个事件处理器,
更多精彩
赞助商链接