0

我有一个将页面上的方法绑定到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);
}

这适用于该页面内的方法。我想添加的是对用户控件内部方法的支持。所以我delegate在页面代码隐藏中创建了一个,并在运行时为其分配了用户控制方法。

我像这样创建和分配委托:

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

进而:

PrintPage = DetailedTestsResult1.UserActionsForTests1_PrintPage;

代码尝试查找方法,当找不到方法时,它会尝试为委托查找字段并找到正确的委托,该委托以用户控件类为目标指向正确的方法。

问题是当addHandler.Invoke(controlInstance, addHandlerArgs);达到时,它会抛出异常

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

而且我无法弄清楚我做错了什么。

4

2 回答 2

1

代替:

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

采用:

protected event EventHandler PrintPage;

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

于 2013-10-02T08:58:30.883 回答
1

您不能将委托施放给其他委托。

d = field.GetValue(page) as Delegate;

Delegate orig = field.GetValue(page) as Delegate;
d = Delegate.Combine(
    orig.GetInvocationList()
    .Select(_ => Delegate.CreateDelegate(tDelegate, _.Target, _.Method))
    .ToArray()
    );

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

于 2013-10-02T09:31:14.647 回答