0

一度に複数のデリゲートに同じメソッドを割り当てることは可能ですか?

public class Hoge
{        
    public event Action EventA;
    public event Action EventB;
    public event Action EventC;

    public Hoge()
    {
        EventA += () => FugaMethod();
        EventB += () => FugaMethod();
        EventC += () => FugaMethod();
    }

    private void FugaMethod()
    {
        Console.WriteLine("Hello.");
    }

}

FugaMethod() の割り当てを単純化したいと思います。

4

2 に答える 2

2

イベントはパラメーターとして使用できないため...残念ながら...いいえ

大量のイベントについて話している場合は、リフレクションが適しています...しかし、それを「単純化」とは呼びません

編集:

明確にするために:

パラメータとして渡すことができるもの:

特定のオブジェクトの静的または特定のイベントにアタッチされたイベントハンドラーの現在のリスト (この場合に渡すのはイベントではなく、 ですMulticastDelegate)

パラメータとして渡せないもの: イベント自体...

EventInfo別のイベント ハンドラーをアタッチできるような直接的な方法でイベントを渡すことはできません。そのため、特定のオブジェクト インスタンス、イベント自体の記述、および新しいハンドラーを渡したいと思うでしょう。 ..

「簡素化」について:

あなたがする必要があるのは次のとおりです:

- リフレクションを使用して目的のイベントのオブジェクトを取得しEventInfoます - 各インスタンスと各 EventInfo に対して EventInfo.AddEventHandler を呼び出し、インスタンスをターゲットとして、イベントハンドラーをハンドラーとして渡します

イベントをパラメーターとして渡すことができないため、単純でタイプセーフなメソッドを抽出して目的の EventInfo オブジェクトを取得することはできません。名前による選択、または Type.getEvent または Type.getEvents を使用してインスタンス タイプを分解するその他のロジックを使用する必要があります。

したがって、数百のようなたわごとのイベントを処理していない場合は、あなたが行ったように書くことが望ましい方法のようです...リフレクションアプローチは、より単純または短いものではありません

于 2015-01-05T06:20:23.593 に答える
0

リフレクションを必要としない複数のイベント ハンドラーを一度に割り当てる方法がありますが、簡単ではなく、プログラミングが必要です。イベントをループで初期化する場合は、辞書を使用してイベントを保存できます。

補足として、慣例によりevent、デリゲートのタイプが の場合にのみキーワードを使用する必要がありEventHandlerます。他の人が使用しようとすると、混乱する可能性があります。

Hogeクラス:

public class Hoge
{
    // A dictionary to store your events.
    private Dictionary<string, EventHandler> events = new Dictionary<string, EventHandler>()
    {
        { "EventA", null },
        { "EventB", null },
        { "EventC", null }
    };

    // Event add/remove accessors.
    public event EventHandler EventA
    {
        add
        {
            lock (events)
            {
                events["EventA"] += (EventHandler)events["EventA"] + value;
            }
        }
        remove
        {
            lock (events)
            {
                events["EventA"] += (EventHandler)events["EventA"] - value;
            }
        }
    }

    // You can do the same for other events.
    public event EventHandler EventB;
    public event EventHandler EventC;

    public Hoge()
    {
        // Initialize events in a loop.
        foreach (var key in events.Keys.ToList())
        {
            events[key] += FugaMethod;
        }
    }

    // Raises EventA.
    public void RaiseEventA()
    {
        EventHandler handler;
        if (null != (handler = (EventHandler)events["EventA"]))
        {
            handler(this, EventArgs.Empty);
        }
    }

    // Event handler.
    private void FugaMethod(object sender, EventArgs e)
    {
        Console.WriteLine("Hello.");
    }
}

使用法:

class Program
{
    static void Main(string[] args)
    {
        new Hoge().RaiseEventA();
    }
}

方法: ディクショナリを使用してイベント インスタンスを格納する (C# プログラミング ガイド)

イベントの処理と発生

于 2015-01-05T06:54:12.917 に答える