1

実行時にジェネリック デリゲートを接続したいので、以下のサンプル コードを確認してください。

ただし、デリゲートをイベントにバインドするとDelegate.CreateInstanceArgumentException(「ターゲット メソッドへのバインド エラー」) が発生します。

class MyClass
{
    public event EventHandler<MyEventArgs> OnRequest;
}

class MyEventArgs : EventArgs { }

class Program
{
    static void Main(string[] args)
    {
        MyClass obj = new MyClass();
        EventInfo eventInfo = obj.GetType().GetEvent("OnRequest");
        Type delegateType = eventInfo.EventHandlerType;
        MethodInfo methodInfo = typeof(Program).GetMethod("OnRequestReceived");
        Delegate del = Delegate.CreateDelegate(delegateType, methodInfo);
    }

    public static void OnRequestReceived(object o, EventArgs e) { }
}
4

1 に答える 1

1

静的メソッドのデリゲートを作成するときnullは、オブジェクトインスタンスの代わりに渡す必要があります。インスタンスメソッドを作成する場合は、ハンドラーメソッドを定義するオブジェクトのインスタンスへの参照である必要があります。イベントを定義するオブジェクト。

Delegate.CreateDelegate(delegateType, null, methodInfo);

このシナリオでは、さらに単純化して、デリゲートタイプとメソッド情報のみを必要とするオーバーロードを使用することができます。

Delegate.CreateDelegate(delegateType, methodInfo);

また、提供したサンプルコードでは、デリゲートを作成しているだけで、実際にはデリゲートをイベントにアタッチしていないことに注意してください。イベントにバインドするには、次のことも必要です。

eventInfo.AddEventHandler(obj, del);
于 2012-08-23T10:49:17.033 に答える