0

我正在尝试实现 EventArgs 以将参数列表传递给我的消息传递系统:Question

我将 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 回答