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

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

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

提前致谢。

【问题讨论】:

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

标签: c# reflection event-handling


【解决方案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 将接收原始参数和引发事件的对象。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        相关资源
        最近更新 更多