2016-06-30 10 views
1

Eventの代理人を動的に作成する最良の方法は、どのようにターゲットMethodInfoにはEventと異なるパラメータがありますか?ここでターゲットメソッドのパラメータが異なるイベントのデリゲートを作成するにはどうすればよいですか?

は私のクラスのコードです:ここで

public class Class1 
{ 
    public event EventHandler<EventArgs> refresh; 

    public void AddHandlerToEventInfo(EventInfo eventInfo, string methodInfoName) 
    { 
     Type tDelegate = eventInfo.EventHandlerType; 

     var sourceType = this.GetType(); 

     Delegate d = Delegate.CreateDelegate(tDelegate, this, methodInfoName); 

     MethodInfo addHandler = eventInfo.GetAddMethod(); 
     Object[] addHandlerArgs = { d }; 

     addHandler.Invoke(this, addHandlerArgs); 
    } 

    public void HandleEvent(object sender, EventArgs e) 
    { 

    } 

    public void Test() 
    { 

    } 
} 

Class1を呼び出すためのコードである:ここでは

private void AddHandlers() 
{ 
    var class1 = new Class1(); 
    var eventInfo = class1.GetType().GetEvent("refresh"); 
    class1.AddHandlerToEventInfo(eventInfo, "HandleEvent"); 

    class1.AddHandlerToEventInfo(eventInfo, "Test"); 
} 

は例外です:

タイプ「システムの未処理の例外.ArgumentException 'が発生しました mscorlib.dll

追加情報: 署名またはセキュリティの透過性が デリゲートタイプのものと互換性がないため、ターゲットメソッドにバインドできません。例外はラインで発生している

Delegate d = Delegate.CreateDelegate(tDelegate, this, methodInfoName); 

例外が発生している理由を私は理解し、質問は例外ではないですが、どのようにTestメソッドのデリゲートを作成します。

+2

'Test'メソッドを別のメソッドでラップします。 – Tommy

+0

メソッドと一致しない型のデリゲートを作成しようとしています。あなたはそれをすることはできません。 – Blorgbeard

+0

@ Tommy参考にしてもらえますか? – user3736648

答えて

1

Testメソッドを直接呼び出すラッピングメソッドを作成します。

public void WrapTest(object sender, EventArgs e) 
{ 
    Test(); 
} 
public void Test() 
{ 
    ... 
} 

代わりにラッピング方法を追加してください。

class1.AddHandlerToEventInfo(eventInfo, "WrapTest"); 
関連する問題