2011-11-18 116 views
1

我正在改进我的项目的现有消息传递系统,该系统应接受可变数目的参数。现在泛型被用来将参数传递给系统。很多代码都会重演,所以问题是 - 是否有可能将具有不同参数数量的类的所有版本合并到一个类中? 整个邮件系统我需要为我的一个基础,可以在这里找到:CSharpMessenger可变数量的参数

代码摘录:

public delegate void Callback(); 
public delegate void Callback<T>(T arg1); 
public delegate void Callback<T, U>(T arg1, U arg2); 

版本不带参数:

一个参数
static public class Messenger 
{ 
    private static Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>(); 

    static public void AddListener(string eventType, Callback handler) 
    { 
     if (!eventTable.ContainsKey(eventType)) 
     { 
      eventTable.Add(eventType, null); 
     } 
     // Add the handler to the event. 
     eventTable[eventType] = (Callback)eventTable[eventType] + handler; 
    } 

    static public void Invoke(string eventType) 
    { 
     Delegate d; 
     if (eventTable.TryGetValue(eventType, out d)) 
     { 
      Callback callback = (Callback) d; 
      if (callback != null) 
      { 
       callback(); 
      } 
     } 
    } 
} 

版本:

static public class Messenger<T> 
{ 
    private static Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>(); 

    static public void AddListener(string eventType, Callback<T> handler) 
    { 
     if (!eventTable.ContainsKey(eventType)) 
     { 
      eventTable.Add(eventType, null); 
     } 
     // Add the handler to the event. 
     eventTable[eventType] = (Callback<T>)eventTable[eventType] + handler; 
    } 

    static public void Invoke(string eventType, T arg1) 
    { 
     Delegate d; 
     if (eventTable.TryGetValue(eventType, out d)) 
     { 
      Callback<T> callback = (Callback<T>) d; 
      if (callback != null) 
      { 
       callback(arg1); 
      } 
     } 
    } 
} 

版本wi日两个参数:

static public class Messenger<T, U> 
{ 
    private static Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>(); 

    static public void AddListener(string eventType, Callback<T, U> handler) 
    { 
     if (!eventTable.ContainsKey(eventType)) 
     { 
      eventTable.Add(eventType, null); 
     } 
     // Add the handler to the event. 
     eventTable[eventType] = (Callback<T, U>)eventTable[eventType] + handler; 
    } 

    static public void Invoke(string eventType, T arg1, U arg2) 
    { 
     Delegate d; 
     if (eventTable.TryGetValue(eventType, out d)) 
     { 
      Callback<T, U> callback = (Callback<T, U>) d; 
      if (callback != null) 
      { 
       callback(arg1, arg2); 
      } 
     } 
    } 
} 

正如你所看到的大部分代码重演,是否有可能创建同一类的一些通用版本,将采用可变数目的参数,以避免重复相同的代码很多次?

谢谢。

+0

不是泛型类上的调用缺少回调参数吗? –

+0

您没有将任何参数传递给回调函数? – BrokenGlass

+0

@Jordão是的,你说得对。当我删除所有不必要的代码时,我很着急。 –

回答

2

回调参数通常在EventArgs的子类中传递。已经有一个简单的通用代理抽象出来了:EventHandler<TEventArgs> where TEventArgs : EventArgs。参数的可变性可以添加到EventArgs的子类中。

所以,如果你可以重构你的代码来使用这些类,你可以只有一个版本。类似这样的:

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

    public static void AddListener(string eventType, EventHandler<TEventArgs> handler) { 
    if (eventTable.ContainsKey(eventType)) { 
     eventTable[eventType] = eventTable[eventType] + handler; 
    } 
    else { 
     eventTable.Add(eventType, handler); 
    } 
    } 

    public static void Invoke(string eventType, TEventArgs args) { 
    EventHandler<TEventArgs> d; 
    if (eventTable.TryGetValue(eventType, out d)) { 
     if (d != null) { 
     d(args); 
     } 
    } 
    } 
}