我正在使用一个类,它在事件处理程序的签名中不包含发件人对象的参数。
如何从事件处理程序中确定引发事件的对象?我如何获得对这个对象的引用?可以用反射来完成吗?
提前致谢。
答案 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将收到原始参数和引发事件的对象。
这不是人们想要输入的东西,但如果你只有几个地方可以创建类并添加事件处理程序,那么它可能是另一种选择。