如何为目标方法具有不同参数的事件创建委托?

时间:2016-06-30 02:42:14

标签: c# delegates

如何为Event动态创建委托的最佳方式,其中目标MethodInfo具有与Event不同的参数?

这是我的班级代码:

public class Class1
{
    public event EventHandler<EventArgs> refresh;

    public void AddHandlerToEventInfo(EventInfo eventInfo, string methodInfoName)
    {
        Type tDelegate = eventInfo.EventHandlerType;

        var sourceType = this.GetType();

        Delegate d = Delegate.CreateDelegate(tDelegate, this, methodInfoName);

        MethodInfo addHandler = eventInfo.GetAddMethod();
        Object[] addHandlerArgs = { d };

        addHandler.Invoke(this, addHandlerArgs);
    }

    public void HandleEvent(object sender, EventArgs e)
    {

    }

    public void Test()
    {

    }
}

以下是调用Class1的代码:

private void AddHandlers()
{
    var class1 = new Class1();
    var eventInfo = class1.GetType().GetEvent("refresh");
    class1.AddHandlerToEventInfo(eventInfo, "HandleEvent");

    class1.AddHandlerToEventInfo(eventInfo, "Test");
}

以下是例外:

  

未处理的类型&#39; System.ArgumentException&#39;发生在   mscorlib.dll中

     

其他信息:无法绑定到目标方法,因为它   签名或安全透明度与   代表类型。

例外情况发生在以下行:

Delegate d = Delegate.CreateDelegate(tDelegate, this, methodInfoName);

我理解为什么会发生异常,问题不是关于异常,而是如何为Test方法创建委托。

1 个答案:

答案 0 :(得分:1)

创建一个直接调用Test方法的包装方法。

public void WrapTest(object sender, EventArgs e)
{
    Test();
}
public void Test()
{
    ...
}

改为使用包装方法。

class1.AddHandlerToEventInfo(eventInfo, "WrapTest");