2009-06-12 20 views
2

の期間中、イベントへの登録:は、私はしばしば、次のコードに遭遇して使用してブロック

myService.SomeEvent += listener; 
myService.DoSomething(); 
myService.SomeEvent -= listener; 

これは素晴らしいですが、私たちはよりよい方法でこれを行うことができれば、それは素晴らしいことです。 - =(正当な理由のために)

myService.SomeEventのみ+ =またはの左側に表示されますので、残念ながら、これをC#で禁止されて
using(EventScope.Start(myService.SomeEvent, listener)){ 
    myService.DoSomething(); 
} 

:私のような何かを考えていました。私の質問は、私が他にどんな選択肢を持っているかです。私は「を使用して」構文を使用してと結婚していないよ明確にするため

using(EventScope.Start(myService, "SomeEvent", listener){ 
    myService.DoSomething(); 
} 

:理想的には私はこれが(私はすでに実装されてきた)反射を除外し、次の操作を実行し、安全種類、なりたいですあなたはそれが言語の歪曲だと言うことができると主張することができます。他のオプションは高く評価されます!

+0

ええ、それはあなたが離れて得られる最高のように、文字列を渡して、それからEventInfoオブジェクトを構築するようです。 – Noldorin

+0

私はそれが事実でないことを望んでいた...それはうまく動作しますが、理想的ではありません。 – jonnii

+1

スタイルの問題として、私はtry-finallyを使用します。これは、操作の意味論は、「イベントを購読する、事を行う、いつでも購読を停止する」ことを強調している。使い捨てのオブジェクトを使用することは、「この物は積極的に清掃する必要があるリソースがある」ことを強調しています。私は、プログラムセマンティクスとクリーンアップメカニズムを混ぜるのは嫌いです。私は「倒錯」までは行かないと思っていますが、少なくとも悪臭を覚える練習にはあります。 –

答えて

2

ありクリーナーの構文でこれを行う方法は、おそらくですが、あなたは、このような構造体を持っている場合...

public struct ActionDisposable : IDisposable 
{ 
    private readonly Action _action; 

    public ActionDisposable(Action action) 
    { 
     _action = action; 
    } 

    public void Dispose() 
    { 
     _action(); 
    } 
} 

...と、このような方法:

public static IDisposable EventScope(Action subscribe, Action unsubscribe) 
{ 
    subscribe(); 
    return new ActionDisposable(unsubscribe); 
} 

ことあなたはこのようなコードを書いてみましょうになります。

using (EventScope(() => myService.SomeEvent += listener,() => myService.SomeEvent -= listener)) 
{ 
    myService.DoStuff(); 
} 

またはこのような:

myService.SomeEvent += listener 
using (new ActionDisposable(() => myService.SomeEvent -= listener)) 
{ 
    myService.DoStuff(); 
} 
+0

私の古い質問のいくつかに戻ってマークしています。これは利用可能な回答の中で最高です... – jonnii

2

イベントが例外などの理由で登録解除されないことが心配ですか?もしそうなら、try/finallyを使うことができます。さもなければ、私はオリジナルの方法が最高だと思うし、私にはうまく見えます。

+0

それはまさにその理由です。 try/finallyを使用することができます。これは、使用ブロックが何であるか(種類)です。 – jonnii

+2

usingステートメントは私にIDisposableセマンティクスを提案していますが、try/finallyはあなたが例外について心配していることを示唆しています。私はtry/finallyと一緒に行きます。 – PeterAllenWebb