2017-06-23 7 views
0

C#でイベントハンドラを追加および削除する方法は、+ =および - =演算子を引数として渡すことで、1つのメソッドで実行できますか?単一のメソッドでC#イベントハンドラを追加/削除する

私は、繰り返しを避けるためにしようとしています:

AttachHandlers() 
{ 
    event1 += handler1; 
    event2 += handler2; 
    // etc... 
} 

DetachHandlers() 
{ 
    event1 -= handler1; 
    event2 -= handler2; 
    // etc... 
} 

または

AttachDetachHandlers(bool attach) 
{ 
    if (attach) 
    { 
    event1 += handler1; 
    event2 += handler2; 
    // etc... 
    } 
    else 
    { 
    event1 -= handler1; 
    event2 -= handler2; 
    } 
} 

を代わりに、私はこのような何か書きたいと思います:ようなもので使用されて

AttachDetachHandlers(operator addRemove) 
{ 
    addRemove(event1, handler1); 
    addRemove(event2, handler2); 
    // etc... 
} 

を:

AttachDetachHandlers(+=); 

異なる署名(+ = & - = doのように)を持つハンドラーは、イベント&ハンドラーで動作するのが理想的です。

+1

ブール値に基づいてif文を使用するのはなぜですか。 – JuanR

+0

@Juan:これはまだ繰り返しているので(質問に例を追加した) – Jimmy

+0

@Sinatrハンドラを接続した直後にデタッチしたくない。私はAttachHandlers()とDetachHandlers()を置き換える単一の関数を必要とします。 – Jimmy

答えて

3

あなたはこの試みることができる。このように使用後

public static void Attach<T>(ref EventHandler<T> a, EventHandler<T> b) 
    { 
     a += b; 
    } 

    public static void Detach<T>(ref EventHandler<T> a, EventHandler<T> b) 
    { 
     a -= b; 
    } 

    public static void AttachDetachHandlers<T>(Action<ref EventHandler<T>, EventHandler<T>> op) 
    { 
     op(ref event1, handler1); 
     op(ref event2, handler2); 
     //etc... 
    } 

を:

 AttachDetachHandlers<int>(Attach); 
     //... 
     AttachDetachHandlers<int>(Detach); 
0

は、このサンプルコードを使用してください。しかし、イベントハンドラのシグネチャは同じでなければならないことに注意してください。

class Program 
{ 
    delegate void dlgHandlerOperation<T>(ref EventHandler<T> Event, EventHandler<T> Handler); 

    static void SetHandler<T>(ref EventHandler<T> Event, EventHandler<T> Handler) { Event += Handler; } 
    static void UnsetHandler<T>(ref EventHandler<T> Event, EventHandler<T> Handler) { Event -= Handler; } 

    static void SetAll(dlgHandlerOperation<int> Op) 
    { 
     Op(ref ev, foo); 
     Op(ref ev, bar); 
    } 

    static event EventHandler<int> ev; 

    static void Main(string[] args) 
    { 
     SetAll(SetHandler); 
     ev?.Invoke(null, 5); 

     SetAll(UnsetHandler); 
     ev?.Invoke(null, 6); 
    } 

    static void foo(object sender, int e) { Console.WriteLine("foo => " + e); } 
    static void bar(object sender, int e) { Console.WriteLine("bar => " + e); } 
} 
関連する問題