C# 将委托动态绑定到事件

C# 将委托动态绑定到事件,c#,reflection,delegates,C#,Reflection,Delegates,我有一个方法可以将页面上的方法绑定到动态创建的LinkButtons protected virtual void AddDynamicHandlerToControl(Page page, Control controlInstance, string methodName, string eventName) { Delegate d = null; EventInfo ei = controlInstance.GetType().GetEvent(ev

我有一个方法可以将页面上的方法绑定到动态创建的
LinkButton
s

protected virtual void AddDynamicHandlerToControl(Page page, Control controlInstance,
            string methodName, string eventName)
{
   Delegate d = null;

   EventInfo ei = controlInstance.GetType().GetEvent(eventName);

   Type tDelegate = ei.EventHandlerType;

   MethodInfo method = page.GetType().BaseType.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);

   if (method != null)
      d = Delegate.CreateDelegate(tDelegate, page, method);
   else {
      FieldInfo field = page.GetType().BaseType.GetField(methodName, BindingFlags.NonPublic | BindingFlags.Instance);

      if (field != null)
      {
         d = field.GetValue(page) as Delegate;
      }
   }

   MethodInfo addHandler = ei.GetAddMethod();
   object[] addHandlerArgs = { d };
   addHandler.Invoke(controlInstance, addHandlerArgs);
}
这适用于该页面内的方法。我想添加的是对用户控件内部方法的支持。因此,我在代码隐藏页面中创建了一个
委托
,并在运行时将其分配给用户控制方法

我创建并分配代理,如下所示:

protected event PrintPageMethod PrintPage;
protected delegate void PrintPageMethod(object sender, EventArgs e);
然后:

PrintPage = DetailedTestsResult1.UserActionsForTests1_PrintPage;
代码尝试查找方法,当未找到方法时,它尝试查找委托的字段并找到正确的委托,该委托指向以用户控件类为目标的正确方法

问题是当
addHandler.Invoke(controlInstance,addHandlerArgs)时时,它作为异常抛出

“SomePage+PrintPageMethod”类型的对象无法转换为“System.EventHandler”类型

我也不知道我做错了什么。

而不是:

protected event PrintPageMethod PrintPage;
protected delegate void PrintPageMethod(object sender, EventArgs e);
使用:


尽管签名相似,但委托类型不同。

您不能将委托强制转换为其他委托

d=field.GetValue(第页)作为委托;

Delegate orig=field.GetValue(第页)作为委托;
d=委托。合并(
orig.GetInvocationList()
.Select(=>Delegate.CreateDelegate(tDelegate、0.Target、0.Method))
.ToArray()
);

您可以从
.target
.Method
使用调用目标创建另一个
委托
,如果委托有多个目标,则必须组合每个委托。

这似乎是一种解决方法,而不是修复方法。代码似乎应该看到
PrintPage
事件的类型为
PrintPageMethod
,并创建一个
PrintPageMethod
委托。谢谢!事件如果这是一个解决方法(我仍然不明白为什么使用委托不起作用),这就解决了我的问题。显示完整的用户控件(与事件相关的东西)@jgauffin-我本来会添加usercontrol代码,但由于委托是指向函数的指针,我看不到显示函数本身的相关性。例外情况不是将函数分配给委托,而是将委托分配给事件句柄。
protected event EventHandler PrintPage;