0

EventArgsを実装して、パラメーターのリストをメッセージングシステムに渡そうとしています:質問

EventArgsをサブクラス化しました:

public class SingleParameterArgs<T> : EventArgs
{
    public T arg1;

    public SingleParameterArgs(T _arg1)
    {
        arg1 = _arg1;
    }
}

EventArgsを受け入れる必要があるクラスとメソッドは次のとおりです。

static public class Messenger<TEventArgs> where TEventArgs : EventArgs {
    private static Dictionary< string, EventHandler<TEventArgs> > eventTable = new Dictionary< string, EventHandler<TEventArgs> >();

    static public void Invoke(string eventType, TEventArgs args) {
        EventHandler<TEventArgs> eventHandler;

        if (eventTable.TryGetValue(eventType, out eventHandler)) {          
            if (eventHandler != null)
                eventHandler();
        }
    }

}

EventArgsを実装する前に、次の方法でメッセージを呼び出します。

Messenger<GameEndingType>.Invoke( "end game", GameEndingType.TimeEnded );

しかし、今でははるかに長く、はるかに複雑に見えます。

Messenger< SingleParameterArgs<GameEndingType> >.Invoke( "end game", new SingleParameterArgs<GameEndingType>(GameEndingType.TimeEnded) );

短く見せることはできますか?メッセージを送信するたびにこのような長い行を入力したくありません。多分私はラッパーを作成することができますか?次のようなものが最適です:Messenger.Invoke( "end game"、GameEndingType.TimeEnded);

ランダムな量のパラメーターに対して均一なラッパーを作成するための最良の方法は何ですか?

4

1 に答える 1

0

Messengerクラスが結ばれて満足していますSingleParameterArgs<T>か?もしそうなら、あなたは使用することができます:

// Here TEventArgs represents the element type *within* SingleParameterArgs
public static class Messenger<TEventArgs> {
    private static
        Dictionary<string, EventHandler<SingleParameterArgs<TEventArgs>> eventTable = 
            new Dictionary<string, EventHandler<SingleParameterArgs<TEventArgs>>();

    public static void Invoke(string eventType, TEventArgs args) {
        EventHandler<SingleParameterArgs<TEventArgs>> eventHandler;

        if (eventTable.TryGetValue(eventType, out eventHandler)) {          
            if (eventHandler != null) {
                eventHandler();
            }
        }
    }
}

もちろん、Messenger(あなたの質問によると)完全に一般的なクラスとそれSingleParameterMessengerに委任するクラスの両方を持つことができます:

public static class SingleParameterMessenger<TEventArgs> {
    public static void Invoke(string eventType, TEventArgs args) {
        Messenger<SingleParameterArgs<TEventArgs>>.Invoke(eventType, args);
    }
}

余談ですが、とにかくこれがすべて良いアイデアかどうかはわかりません。特に静的登録に関しては、テストが難しくなる傾向があり並行性に関してはもっと注意が必要です。(現在、コードはスレッドセーフではありません。)

于 2011-11-18T06:25:10.167 に答える