1

假设我有一个仅用于指定 C# 事件的类,并且我在我的应用程序中传递了这个类。

public class MyEvents
{
    public event MyEventHandler OnBeforeSomeAction;
    public event MyEventHandler OnSomeAction;
}

为了调用这些事件,调用必须来自类本身。让其他类MyEvents在传递到应用程序时触发这些事件的简单方法是创建公共触发函数。

public class MyEvents
{
    public event MyEventHandler OnBeforeSomeAction;
    public event MyEventHandler OnSomeAction;

    public void TriggerOnBeforeSomeAction()
    {
        OnBeforeSomeAction();
    }

    public void TriggerOnSomeAction()
    {
        OnSomeAction();
    }
}

但是,如果这个类上有很多事件,那么也必须有很多触发方法。有没有办法使用反射来获取事件并触发它?像这样的东西:

public class MyEvents
{
    public event MyEventHandler OnBeforeSomeAction;
    public event MyEventHandler OnSomeAction;

    public void TriggerEvent(string eventName)
    {
        var event = // some magic reflection.
        event.Invoke();
    }
}
4

1 回答 1

2

正是你想要的 - 取自这个精彩的页面......

    public void TriggerEvent(string handler, EventArgs e)
    {
        MulticastDelegate eventDelegate =
              (MulticastDelegate)this.GetType().GetField(handler,
               System.Reflection.BindingFlags.Instance |
               System.Reflection.BindingFlags.NonPublic).GetValue(this);

        Delegate[] delegates = eventDelegate.GetInvocationList();

        foreach (Delegate dlg in delegates)
        {
            dlg.Method.Invoke(dlg.Target, new object[] { this, e });
        } 
    }
于 2012-10-09T21:17:13.667 回答