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

时间:2011-06-21 09:48:18

标签: c# reflection event-handling

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

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

提前致谢。

3 个答案:

答案 0 :(得分: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());
   }

}

答案 1 :(得分:0)

MSDN forums或其他谷歌“C#动态演员或演员”

尝试此操作

答案 2 :(得分:0)

您可以使用drharris的解决方案,这似乎更通用,更“清晰”,或者您可以使用匿名代表:

MyComClass cl = new MyComClass();

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

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

这不是人们想要输入的东西,但如果你只有几个地方可以创建类并添加事件处理程序,那么它可能是另一种选择。