WEB开发网
开发学院软件开发VC 更新MFC中的视图,跟踪.NET Framework中的事件 阅读

更新MFC中的视图,跟踪.NET Framework中的事件

 2006-07-19 11:28:40 来源:WEB开发网   
核心提示: 找到这些事件相对容易,.NET Framework 一个最强大的特性之一就是反射,更新MFC中的视图,跟踪.NET Framework中的事件(4),这是一种奇特的方式,我们把它叫做.NET的自我意识,你将失去辨别它们的能力,因此跟踪事件的唯一方法是为每个事件编写不同的处理器,例如,为找出

找到这些事件相对容易。.NET Framework 一个最强大的特性之一就是反射,这是一种奇特的方式,我们把它叫做.NET的自我意识。例如,为找出 Form 类中的所有的 public 事件,可以这样写:EventInfo[] allEvents = typeof(Form).GetEvents();

这获得了一个 EventInfo 对象数组,每个元素对应于一个 Form 类中定义的事件。每个 EventInfo 对象包括描述 该事件的信息。EventInfo.Name 是事件的名字(例如,Click 或Closing)。EventInfo.EventHandlerType 是 需要用来处理该事件的处理器的类型(delegate)。你甚至可以调用 EventInfo.AddEventHandler 增加另一个处理器。这会使你猜想一个跟踪事件的方法 是写一个通用的处理器,把它挂到类种你想要跟踪的每一个事件上。这是一种正确的途径,但是细节有点复杂。如何写出这个通用处理器?署名是什么?答案显然应该是:

// generic event handler-for any event
public void OnAnyEvent(Object sender, EventArgs e);

然而,并不是所有的处理器都使用 EventArgs。例如,Form.Closing 事件使用一个要求CancelEventArgs 的处理 器。

void OnClosing(Object sender, CancelEventArgs e);

当然,CancelEventArgs 从 EventArgs 派生而来,所以将 CancelEventArgs 传递给某个期望 EventArgs 的方法是完全合法的——但是.NET 1.1版本中委托不是这样工作的。当使用 += 或者 EventInfo.AddEventHandler 添加事件处理器时,你必须提供一个委托,其类型必须与该事件处理器的类型完全匹配。这意味着你不能用单一的通用处理器来处理所有事件。每一个事件委托署名至少需要一个处理 器。

但可能会更糟。即使你能使用一个通用的处理器,处理器如何知道哪个事件被触发?跟踪工具的关键是报告哪个事件被触发?如若没有其它的,跟踪工具应该显示事件的名字。但是 Framework 并不传递被触发的是哪个事件的信息,因为该信息被隐含在处理器自身信息当中。你知道是 Fooble 事件,因为你的 OnFooble 处理器被调用了。如果你对多个事件使用同样的 处理器,你将失去辨别它们的能力。因此跟踪事件的唯一方法是为每个事件编写不同的处理器。这似乎是一个无法克服的难题: 直到运行时你才知道期望跟踪的对象及其公开的事件,那你怎么可能编写代码呢?

上一页  1 2 3 4 5 6 7  下一页

Tags:更新 MFC 视图

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接