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

C# 从事件处理程序确定发送方对象,c#,reflection,event-handling,C#,Reflection,Event Handling,我正在使用一个类来引发一个事件,该事件在其事件处理程序的签名中不包含发送者对象的参数 如何从事件处理程序确定引发事件的对象?如何获取对此对象的引用?可以使用反射来完成吗 提前感谢。请从谷歌“C#dynamic cast或casting”中尝试此功能。我认为最好的方法是使用适配器模式。基本上,您可以在代码中创建一个类来封装正在构建的COM类,该类包含自己的事件,可以提供更详细的信息。类的每个实例都将创建自己的COM类实例,处理COM事件,并将自己的事件提升到代码的其余部分。因此,您不知道哪个COM

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

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


提前感谢。

请从谷歌“C#dynamic cast或casting”中尝试此功能。

我认为最好的方法是使用适配器模式。基本上,您可以在代码中创建一个类来封装正在构建的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());
   }

}
公共类MyClass
{
私有类实例;
公共事件处理程序MyBetterEvent;
公共MyClass()
{
instance.event+=neweventhandler(Handle_COM_event);/…或其他任何东西
}
公共无效句柄COM事件(EventArgs)
{
如果(MyBetterEvent!=null)MyBetterEvent(这是新的BetterEventArgs());
}
}

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

MyComClass cl = new MyComClass();

cl.MyEvent += new MyComClassDelegate(delegate(MyEventArgs args){ RealHandler(cl, args);})
现在,RealHandler将接收原始参数和引发事件的对象


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

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