Оболочка для метода, который принимает (EventArgs) - PullRequest
0 голосов
/ 18 ноября 2011

Я пытаюсь реализовать 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 («конец игры», GameEndingType.TimeEnded);

Каков наилучший способ создания единой оболочки для случайного количества параметров?

1 Ответ

0 голосов
/ 18 ноября 2011

Довольны ли вы тем, что ваш класс 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);
    }
}

Кроме того, я не совсем уверен, что это все-таки хорошая идея - особенно с точки зрения статической регистрации, которая обычно усложняет тестирование, и , безусловно, нуждается в большей заботе с точки зрения параллелизм. (Ваш код в настоящее время не потокобезопасен.)

...