从事件处理程序中确定发件人对象

本文关键字:对象 事件处理 程序 | 更新日期: 2023-09-27 17:59:40

我使用的类引发的事件在其事件处理程序的签名中不包含sender对象的参数。

如何从事件处理程序中确定引发事件的对象?如何获得对该对象的引用?可以使用反射来完成吗?

提前谢谢。

从事件处理程序中确定发件人对象

我认为最好的方法是使用适配器模式。基本上,您将在代码中创建一个类,该类封装您正在构建的COM类,该COM类包含自己的事件,可以提供更详细的信息。类的每个实例都将创建自己的COM类实例,处理COM事件,并将自己的事件引发到代码的其余部分。所以,你不知道哪个COM类引发了这个事件,但你知道它是你自己的类实例中的哪个

但是,这种类型的解决方案在很大程度上取决于你想要实现的目标。如果你只是想获得更好的调试信息,这是一条很好的途径,但如果你试图将其他人的库的部分连接在一起,在很多情况下这不会起到任何作用。

public class MyClass
{
   private COMClass instance;
   public event EventHandler<BetterEventArgs> MyBetterEvent;
   public MyClass()
   {
      instance.event += new EventHandler(Handle_COM_event); // ... or whatever
   }
   public void Handle_COM_event(EventArgs)
   {
      if(MyBetterEvent != null) MyBetterEvent(this, new BetterEventArgs());
   }
}

从MSDN论坛或谷歌"C#动态铸造或铸造"中尝试此操作

您可以使用drharris的解决方案,它看起来更通用、更"清晰",也可以使用匿名委托:

MyComClass cl = new MyComClass();
cl.MyEvent += new MyComClassDelegate(delegate(MyEventArgs args){ RealHandler(cl, args);})

现在,RealHandler将接收原始参数和引发事件的对象。

这不是人们想要经常键入的内容,但如果您只有几个地方可以创建类和添加事件处理程序,那么它可能是一种替代方法。