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 に答える