0

以下のサンプルを参照してください。イベントへのリフレクションを通じて取得した DoSomething メソッドを接続する必要があります。

    class Program {
    private static event EventHandler MyEvent;

    static void Main(string[] args)
    {
        object aType = new SomeType();

        var type = aType.GetType();

        var method = type.GetMethod("DoSomething");

        if (method != null)
        {
            MyEvent += method;//How do I wire this up?
        }
    }
}


public class SomeType {
    public void DoSomething() {
        Debug.WriteLine("DoSomething ran.");
    }
}
4

2 に答える 2

4

実際には、正しい署名がないためDoSomething、 のハンドラとして使用できません。MyEventの署名を次のように変更すると仮定しますDoSomething

public void DoSomething(object sender, EventArgs e)

次のようにイベントをサブスクライブできます。

    if (method != null)
    {
        var dlg = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method);
        MyEvent += dlg;
    }
于 2013-07-07T17:20:06.773 に答える
4

デリゲートを作成する必要があります。

MyEvent += (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method);

2 番目の引数は、デリゲートをバインドするインスタンスです。
詳細については、私のブログを参照してください。

他のデリゲートと同様に、これは、ターゲット メソッドがデリゲートと同じシグネチャ (パラメーターの型) を持っている場合にのみ機能します。

于 2013-07-07T17:17:46.757 に答える