public class a
{
public event eventhandler test;
public void RaiseTest(){//fire test}
}
Run Code Online (Sandbox Code Playgroud)
是否可以在不调用方法的情况下,从此类外部进行此类测试?
基本上,我有大量事件必须基于外部源引发,并且不想为每个事件创建Raise()函数。
是否可以创建一个通用的Raise()来接受要引发的事件作为参数?因此仍然可以在班级内部调用它吗?
您可以通过反射来做到这一点,但这并不明显。如果在C#中声明一个事件,则将使用事件名称+“ Event”将一个字段添加到类中。如果在该字段上调用GetValue,它将返回一个MulticastDelegate实例。
获得MulticastDelegate后,您可以获取调用列表,并依次调用每个成员:
EventArgs e = new EventArgs(myClassInstance); // Create appropriate EventArgs
MulticastDelegate eventDelagate =
this.GetType().GetField(theEventName + "Event",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic).GetValue(myClassInstance) as MulticastDelegate;
Delegate[] delegates = eventDelagate.GetInvocationList();
foreach (Delegate del in delegates) {
del.Method.Invoke(del.Target, new object[] { myClassInstance, e });
}
Run Code Online (Sandbox Code Playgroud)
请注意,这需要从实例中获取NonPublic字段,因此它仅在完全信任的情况下才有效,并且非常有限。
是否可以创建一个通用的Raise()来接受要引发的事件作为参数?因此仍然可以在班级内部调用它吗?
是。修改上面的代码可以很容易地做到这一点。只需将“ myClassInstance”替换为此。实际上,这也将使它在完全信任的情况下也能正常工作,因为NonPublic BindingFlag不再是问题。
| 归档时间: |
|
| 查看次数: |
3270 次 |
| 最近记录: |