C# 接受(EventArgs)的方法的包装器

C# 接受(EventArgs)的方法的包装器,c#,delegates,eventargs,C#,Delegates,Eventargs,我正在尝试实现EventArgs以将参数列表传递给我的消息传递系统: I子类EventArgs: public class SingleParameterArgs<T> : EventArgs { public T arg1; public SingleParameterArgs(T _arg1) { arg1 = _arg1; } } static public class Messenger<TEventArgs>

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

I子类EventArgs:

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

    public SingleParameterArgs(T _arg1)
    {
        arg1 = _arg1;
    }
}
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的类和方法:

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

    public SingleParameterArgs(T _arg1)
    {
        arg1 = _arg1;
    }
}
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.Invokeend游戏,GameEndingType.TimeEnded

为任意数量的参数创建统一包装的最佳方法是什么?

您是否愿意将Messenger类绑定到SingleParameterArgs?如果是这样,您可以使用:

// 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实际上是一个糟糕的设计。不要使用样式。重构它。