从事件处理程序确定发送者对象
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 在客户端发送多个事件和多个事件处理程序