从事件处理程序确定发送者对象

Posted

技术标签:

【中文标题】从事件处理程序确定发送者对象【英文标题】:Determine sender object from event handler 【发布时间】:2011-06-21 09:48:17 【问题描述】:

我正在使用一个类引发一个事件,该事件在其事件处理程序的签名中不包含发送者对象的参数。

如何通过事件处理程序确定引发事件的对象?如何获得对这个对象的引用?可以用反射来完成吗?

提前致谢。

【问题讨论】:

我认为这是不可能实现的。为什么不能简单地将发送者放在事件处理程序中? 因为不是我的代码,所以不能修改事件处理程序的签名 这是什么事件?.. 是 ASP。 ? 引发事件的类来自一个专有的 vb6 类通过 com interop 您还有哪些其他事件参数? 【参考方案1】:

我能想到的最好方法是使用适配器模式之类的东西。您基本上会在代码中创建一个类,该类包装您正在构建的 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());
   


【讨论】:

【参考方案2】:

从MSDN forums 试试这个或以其他方式谷歌“C# 动态转换或转换”

【讨论】:

【参考方案3】:

您可以使用 drharris 的解决方案,它看起来更通用和“更清晰”,也可以使用匿名代表:

MyComClass cl = new MyComClass();

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

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

这不是一个想要输入很多的东西,但如果您只有几个地方可以创建类和添加事件处理程序,它可能是一种替代方法。

【讨论】:

以上是关于从事件处理程序确定发送者对象的主要内容,如果未能解决你的问题,请参考以下文章

在事件处理程序中访问事件对象

在 VBA 中以编程方式确定 OnClick 事件的事件处理程序

Websockets 在客户端发送多个事件和多个事件处理程序

事件处理

在Twisted,Oscar中从外部事件处理程序发送ICQ消息

iOS-事件处理