2011-11-18 117 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); 
     } 
    } 
    } 
}