1回のメソッド呼び出しで複数のイベントのサブスクライブを解除することは可能ですか?

マーク・バンフォード

シナリオは次のとおりです。

私は多くの異なるイベントを購読するクラスを持っています:

ProviderOfFruit.Event += OnFruitHarvested;
ProviderOfCars.Event += OnCarBrokeDown;
ProviderOfPeople.Event += OnPersonAwoke;
...etc

後で、これらすべてから同時に退会したいと思います。私はこれを完全に書き出す運命にありますか?

ProviderOfFruit.Event -= OnFruitHarvested;
ProviderOfCars.Event -= OnCarBrokeDown;
ProviderOfPeople.Event -= OnPersonAwoke;
...etc

または、次の方針に沿って何かを行う方法はありますか?

ListOfEvents.Unsubscibe(); ?

注:すべてのサブスクライバーのイベントをクリアしたくありません。多くのクラスがイベントにサブスクライブされています。それらのクラスの1つに、サブスクライブしているイベントのサブスクライブを解除してもらいたいだけです。ここでの目的は、特定のイベントから退会することを決して忘れないことです。

Evk

次のパターンを使用できます。最初に、構築時に渡す任意の関数を実行し、破棄時に別の関数を実行するクラスを作成します。

public class EventSubscription : IDisposable {
    private readonly Action _unsubscribe;

    private EventSubscription(Action subscribe, Action unsubscribe) {
        _unsubscribe = unsubscribe;
        subscribe();
    }

    public static IDisposable Create(Action subscribe, Action unsubscribe) {
        return new EventSubscription(subscribe, unsubscribe);
    }

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

次に、イベントをサブスクライブするクラスにフィールドを作成します。

private static readonly List<IDisposable> _subscriptions = new List<IDisposable>();

そして、このようにサブスクライブします:

_subscriptions.Add(EventSubscription.Create(
    () => Event1 += OnEvent1, 
    () => Event1 -= OnEvent1));
_subscriptions.Add(EventSubscription.Create(
    () => Event2 += OnEvent2, 
    () => Event2 -= OnEvent2));

登録を解除する必要がある場合は、次のようにしてください。

_subscriptions.ForEach(c => c.Dispose());

利点には、一度にすべてのサブスクリプションを解除することと、同じ呼び出しで常にペアでパス+=-=ハンドラーを渡すため、サブスクリプションを解除することを忘れる可能性がはるかに少ないことが含まれます

これのバリエーションは、この汎用クラスです。

public class Disposable : IDisposable {
    private readonly Action _action;
    private Disposable(Action action) {
        _action = action;
    }
    public static IDisposable FromAction(Action action) {
        return new Disposable(action);
    }
    public void Dispose() {
        _action();
    }
}

すでに多くの場所(.NETリアクティブ拡張など)で見つけることができますが、そうでない場合は、自分で実装できます。次に、上記のコードは次のようになります。

Event1 += OnEvent1;
_subscriptions.Add(Disposable.FromAction(() => Event1 -= OnEvent1));

もちろん、IDisposableを使用する必要はありません。アクションのリストを作成するだけで済みます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

htmlタグのインラインイベント属性を使用してオブジェクトメソッドを呼び出すことは可能ですか?

分類Dev

インスタンスメソッドをscipyの呼び出し可能オブジェクトとして使用することは可能ですか?

分類Dev

1回のclassmethod呼び出しでクラスの複数のインスタンスをインスタンス化することは可能ですか?

分類Dev

Javaで別のクラスのメインメソッドを呼び出して、呼び出し元のコードに戻ることは可能ですか?

分類Dev

Javascriptサブクラスのインスタンスメソッドは、その親の静的メソッドを呼び出すことができますか?

分類Dev

Swingを使用する場合のJavaメソッド-同じクラスの別のイベントメソッドでイベントメソッドを呼び出すことは可能ですか?

分類Dev

1つのステートメントでオブジェクトを作成してメソッドを呼び出すことは可能ですか?

分類Dev

AspectJでメソッド呼び出しを実行するオブジェクトインスタンスを取得することは可能ですか?

分類Dev

メソッド「printperson()」がサブクラスのプライベートメソッドを呼び出さないのはなぜですか?

分類Dev

タイマーティックイベント内で、メソッドを2回続けて呼び出すことがあるのはなぜですか?

分類Dev

そのクラスの新しいオブジェクトを作成せずに、クラスのインスタンスメソッドを呼び出すことは可能でしょうか?

分類Dev

Android:呼び出し元の通知オブジェクトを作成することは可能ですか?(毎回メソッドを書く代わりに)

分類Dev

自分以外のインスタンスでプライベートメソッドを呼び出すことができるのはなぜですか

分類Dev

Azure Functions:複数のトピックをサブスクライブすることは可能ですか?

分類Dev

データベース内の複数の場所からFirebaseonDisconnect()イベントをサブスクライブすることは可能ですか?

分類Dev

関数へのポインタを使用して、外部クラスのプライベートメソッドを呼び出すことができます

分類Dev

Java:メインクラス内での再帰は、独自のメソッドではなくサブクラスメソッドを呼び出します

分類Dev

Typescriptで、イベントハンドラーとして呼び出される同じクラスの別のメソッドからクラスメソッドを呼び出すにはどうすればよいですか?

分類Dev

エンドポイントはクラウド上で複数のバックエンドサービスを呼び出すことができますか

分類Dev

C#でデリゲートをサブスクライブ(+ =)およびサブスクライブ解除(-=)することの複雑さは何ですか?

分類Dev

配列ネイティブオブジェクトのメソッドとして関数を追加します(メソッドとして関数を呼び出すことは可能ですか?)

分類Dev

Mockitoでテスト済みのオブジェクトメソッド呼び出しを検証することは可能ですか?

分類Dev

サーバーのハブが呼び出すことができるクライアントメソッドのリストを維持するにはどうすればよいですか?

分類Dev

Emberコンポーネントのライフサイクルフックメソッド-スーパーを呼び出すことは必須ですか?

分類Dev

サブクラスがベースクラスコンストラクターを呼び出し、サブクラスArduino C ++でベースクラスのインスタンスメソッドを使用する

分類Dev

親インターフェースのデフォルトメソッドを、そのインターフェースをサブクラス化するインターフェースから呼び出すことができますか?

分類Dev

初期化リストを使用してクラスをインスタンス化し、メソッドを呼び出すことは、すべて1つのコマンドで可能ですか?

分類Dev

参照なしでサブスライスのメソッドを呼び出す

分類Dev

そのクラスメソッドが別のインスタンスによって呼び出されたときに、特定のクラスメソッドと呼ばれる特定のクラスのどのインスタンスが最後に呼び出されるかを見つけることは可能ですか?

Related 関連記事

  1. 1

    htmlタグのインラインイベント属性を使用してオブジェクトメソッドを呼び出すことは可能ですか?

  2. 2

    インスタンスメソッドをscipyの呼び出し可能オブジェクトとして使用することは可能ですか?

  3. 3

    1回のclassmethod呼び出しでクラスの複数のインスタンスをインスタンス化することは可能ですか?

  4. 4

    Javaで別のクラスのメインメソッドを呼び出して、呼び出し元のコードに戻ることは可能ですか?

  5. 5

    Javascriptサブクラスのインスタンスメソッドは、その親の静的メソッドを呼び出すことができますか?

  6. 6

    Swingを使用する場合のJavaメソッド-同じクラスの別のイベントメソッドでイベントメソッドを呼び出すことは可能ですか?

  7. 7

    1つのステートメントでオブジェクトを作成してメソッドを呼び出すことは可能ですか?

  8. 8

    AspectJでメソッド呼び出しを実行するオブジェクトインスタンスを取得することは可能ですか?

  9. 9

    メソッド「printperson()」がサブクラスのプライベートメソッドを呼び出さないのはなぜですか?

  10. 10

    タイマーティックイベント内で、メソッドを2回続けて呼び出すことがあるのはなぜですか?

  11. 11

    そのクラスの新しいオブジェクトを作成せずに、クラスのインスタンスメソッドを呼び出すことは可能でしょうか?

  12. 12

    Android:呼び出し元の通知オブジェクトを作成することは可能ですか?(毎回メソッドを書く代わりに)

  13. 13

    自分以外のインスタンスでプライベートメソッドを呼び出すことができるのはなぜですか

  14. 14

    Azure Functions:複数のトピックをサブスクライブすることは可能ですか?

  15. 15

    データベース内の複数の場所からFirebaseonDisconnect()イベントをサブスクライブすることは可能ですか?

  16. 16

    関数へのポインタを使用して、外部クラスのプライベートメソッドを呼び出すことができます

  17. 17

    Java:メインクラス内での再帰は、独自のメソッドではなくサブクラスメソッドを呼び出します

  18. 18

    Typescriptで、イベントハンドラーとして呼び出される同じクラスの別のメソッドからクラスメソッドを呼び出すにはどうすればよいですか?

  19. 19

    エンドポイントはクラウド上で複数のバックエンドサービスを呼び出すことができますか

  20. 20

    C#でデリゲートをサブスクライブ(+ =)およびサブスクライブ解除(-=)することの複雑さは何ですか?

  21. 21

    配列ネイティブオブジェクトのメソッドとして関数を追加します(メソッドとして関数を呼び出すことは可能ですか?)

  22. 22

    Mockitoでテスト済みのオブジェクトメソッド呼び出しを検証することは可能ですか?

  23. 23

    サーバーのハブが呼び出すことができるクライアントメソッドのリストを維持するにはどうすればよいですか?

  24. 24

    Emberコンポーネントのライフサイクルフックメソッド-スーパーを呼び出すことは必須ですか?

  25. 25

    サブクラスがベースクラスコンストラクターを呼び出し、サブクラスArduino C ++でベースクラスのインスタンスメソッドを使用する

  26. 26

    親インターフェースのデフォルトメソッドを、そのインターフェースをサブクラス化するインターフェースから呼び出すことができますか?

  27. 27

    初期化リストを使用してクラスをインスタンス化し、メソッドを呼び出すことは、すべて1つのコマンドで可能ですか?

  28. 28

    参照なしでサブスライスのメソッドを呼び出す

  29. 29

    そのクラスメソッドが別のインスタンスによって呼び出されたときに、特定のクラスメソッドと呼ばれる特定のクラスのどのインスタンスが最後に呼び出されるかを見つけることは可能ですか?

ホットタグ

アーカイブ