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);
}
}
}
}
正如你所看到的大部分代码重演,是否有可能创建同一类的一些通用版本,将采用可变数目的参数,以避免重复相同的代码很多次?
谢谢。
不是泛型类上的调用缺少回调参数吗? –
您没有将任何参数传递给回调函数? – BrokenGlass
@Jordão是的,你说得对。当我删除所有不必要的代码时,我很着急。 –