4

イベント(またはデリゲート)に反応する方法に関する多くのリソースを見つけました。例えば:

Control.ValueChanged += (sender, e) =>
        {
            //do something
        };

しかし、どうすれば自分のイベントを作成できるのかわかりません。基本的に、イベントを「発生」させる必要のあるクラスがあり、このオブジェクトを作成するクラスでは、このイベントに反応できます。

何か案が?

代わりにDelegateを使用してそれを行う場合、どのように行う必要がありますか(別のクラスで実装できる独自のDelegateオブジェクトを作成する)?

ありがとう!

4

3 に答える 3

8

このようなことを意味しますか?

class Foo
{
    public event EventHandler MyEvent;

    public void DoSomething()
    {
        // do stuff

        // raise the MyEvent event
        var handler = MyEvent;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}
于 2013-02-19T21:42:01.480 に答える
2

私は個人的にActionsを使用しています。

public abstract class ServiceClient
{
    public Action OnNetworkActivityStarted { get; set; }

    private void StartNetworkActivity()
    {
        if (OnNetworkActivityStarted != null)
            OnNetworkActivityStarted();
    }
}

継承クラスは、上記で提供したロジックを使用する/使用できます。

public class MyClient : ServiceClient
{
    public MyClient()
    {
        this.OnNetworkActivityStarted += () => 
        {
            //do whatever the subclass needs to do when the event is fired
        };    
    }
}

これは、クロスプラットフォームのモバイルアプリに使用する予定のクラスライブラリに実装されています。これにより、各デバイスは、ネットワークが開始したことをユーザーに知らせるための独自の戦略を実装できます。

これが役立つことを願っています。

于 2013-02-19T22:45:30.883 に答える
1

必要に応じて、次の2つの異なることができます。

  • デリゲートを保持する変数を作成できます (変数の型は前述のデリゲートになります)。オブジェクトの外部に機能を実装できるようにする場合は、ほとんどの場合、これを行います。このことを使用して値を返すこともできるため、オブジェクトの状態を変更するために使用できます。

  • イベントを作成できます。オブジェクトで何かが発生するのを防ぐことができるようにしたい場合は、これを行います。イベントを発生させます。オブジェクトは、後で何が起こっているかをまったく認識してはなりません。これは通常、ビューを実装するときに行うことです。コントローラーがビューで何が起こっているかを認識できるように、いくつかのイベントを発生させます。その後、ビューをどうするかを決めることができます。

最初の例では、名前の取得はコントローラーで定義されておらず、外部で設定する必要があります。コントローラーはそれがどのように機能するかわかりませんが、整数 ID の名前を取得したいと考えています。インターフェイスと同じように機能します。

public class MyController {
    private NameForIDFetcher NameFetcher { get; set; }
    private List<int> _ids = new List<int>();

    public delegate string NameForIDFetcher(int id);


    public void showNames() {
        if (this.NameFetcher == null) {
            throw new Exception("No NameFetcher set.");
        }

        foreach (int id in this._ids) {
            Console.WriteLine(id + ": " + this.NameFetcher(id));
        }
    }
}

2 番目の例では、ビューは、イベントが表示されたり消えたりするときに、イベントに接続されている可能性のあるすべてのリスナーを防ぐことができます。ただし、誰も接続されていない場合、ビューはその動作を変更するべきではありません (変更すべきケースを誰かが知っている場合はお知らせください)。2 回目に Action を使用したことに注意してください。これは、void を返し、パラメーターで指定したテンプレートを取得するジェネリック デリゲートです。最大 16 個のテンプレート パラメーターを使用できます。つまり、デリゲートは 16 個のパラメーターを受け取ることになりますが、それは本当に厄介なデリゲートになるのではないでしょうか?

public class MyView {

    public event ViewAction onViewAppeared;
    public event Action<MyView> onViewDisappeared;

    public delegate void ViewAction(MyView view);

    public void show() {
        // Stuffs

        if (this.onViewAppeared != null) {
            this.onViewAppeared(this);
        }
    }

    public void hide() {
        // Stufs

        if (this.onViewDisappeared != null) {
            this.onViewDisappeared(this);
        }
    }
}
于 2013-02-19T23:21:43.357 に答える