2

新しいカスタム イベント タイプを導入し、ユーザーがリスナーを追加または削除できるようにする C# クラスがあります。また、ディスパッチ中にすべてのイベント リスナーを無効にするメソッドを実装します。

    public event EventHandler DataCommited;

    private void DetatchListeners()
    {
        if (DataCommited != null)
        {
            foreach (EventHandler eh in DataCommited.GetInvocationList())
            {
                DataCommited -= eh;
            }
        }
    }

DataCommited イベントを引数として取るメソッドを実装することができます。したがって、1 つの方法を使用して一連のイベントの署名を解除できます。私はそれを実装する多くの方法を試しましたが、残念ながらそれを行うことができませんでした. それが実際に可能かどうか、そしてどのようにできるのだろうか。ありがとうございました!!!

4

1 に答える 1

2

DataCommitedイベントを引数として取るメソッドを実装することが可能です。

まあ、そうではありません。あなたは取ることができますがEventInfo、それだけです。このステートメントを理解することが重要です。

public event EventHandler DataCommited;

実際には2つのものを作成します。

  • 他のクラスのコードがサブスクライブおよびサブスクライブ解除できるイベント
  • タイプのフィールドEventHandler。ハンドラーを呼び出すため、またはハンドラーを個別に取得するために使用できます。

現在のコードのより単純な実装は、次のようになります。

public event EventHandler DataCommited;

private void DetatchListeners()
{
    DataCommitted = null;
}

フィールドのようなイベントの購読を解除すると、結局のところ、フィールドの値が変わるだけです。

ただし、がある場合は、EventInfoそのイベントがどのように実装されているかわかりません。フィールドによって直接裏付けられている場合があります-そうではない場合があります...現在のハンドラーのイベントを要求したり、ハンドラーの新しいリストを設定したりする一般的な方法はありません。イベントで直接できることは、購読と購読解除だけです。

フィールドのようなイベントのみを使用する場合は、リフレクションを使用してフィールドの名前を検索し、値をnullに設定できます。ただし、一般的にはできません。

詳細については、デリゲートとイベントに関する私の記事を参照してください。

于 2012-10-08T16:34:02.027 に答える