是否有可能在没有自定义功能的情况下从对象外部引发对象上的事件

Jas*_*yne 4 c# events raise

public class a
{
   public event eventhandler test;
   public void  RaiseTest(){//fire test}
}
Run Code Online (Sandbox Code Playgroud)

是否可以在不调用方法的情况下,从此类外部进行此类测试?

基本上,我有大量事件必须基于外部源引发,并且不想为每个事件创建Raise()函数。

是否可以创建一个通用的Raise()来接受要引发的事件作为参数?因此仍然可以在班级内部调用它吗?

Ree*_*sey 5

您可以通过反射来做到这一点,但这并不明显。如果在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不再是问题。