我有一个关于 C# 泛型和委托的问题:
首先我描述一个普遍的问题---我想要一个委托的集合,这些委托应该有一个类似的形式,例如,我所有的委托都应该有这样的形式:接受两个相同类型的参数,并返回 int。我想对这些委托建模的最佳方法是使用通用委托:
public delegate int MyFunctionDel <T> (T a, T b);
但是如何创建不同类型的 MyFunctionDel 集合?我不能这样声明:
List<MyFunctionDel <T>> mylist; //Compile error: cannot find type T
其次,这就是我真正想要做的。我正在尝试做的事情可以通过上述问题来解决。但是您可以提供替代解决方案。
我写了一个类似集合的结构:它可以保存任何类型的数据。但是结构中的所有数据都应该属于同一类型。不幸的是,由于某些历史原因,这种结构并不通用。这个结构有一个比较方法。
但现在我需要为某些特定类型提供定制的比较器。我想要的行为是:如果结构中有一个用于数据类型的自定义比较器,则使用自定义比较器,否则使用原始的比较方法。这是我的演示代码:
/*
*This piece of code demonstates my idea, but never works
*/
static class Program
{
[STAThread]
static void Main()
{
MyStructure s = new MyStructure ();
//create a customized comparer using Comparison<T> generic delegate
Comparison <string> myStirngComparer = (x , y)=> {
return -x.CompareTo(y);
};
s.CustomizedComparers[typeof(string)] = myStirngComparer;
System.Console.WriteLine (s.Compare("a" , "b")); //I am expecting the result to be 1
}
}
class MyStructure
{
//For simplicity, I won't put storage related code here
public int Compare (object o1, object o2)
{
//let's suppose o1 and o2 are always of same type
switch (o1.GetType())
{
case TypeCode.Single: return Compare<Single> ((Single)o1 , (Single)o2);
case TypeCode.Double: return Compare<Double> ((Double)o1 , (Double)o2);
case TypeCode.String: return Compare<String> ((String)o1 , (String)o2);
//and so on.....
}
return 0;
}
//NOTE: code below won't work
//But my logic is: use a Dictionary to store a map from "Type" to "Comparison<T>"
//When doing the comparison, we first examine if there exists one Comparison<T> for
//Type T in the Dictionary
//Compile failed here
public Dictionary <Type , Comparison<T> > CustomizedComparers = new Dictionary <Type , Comparison<T> > ();
private int Compare<T> (T a , T b)
{
if (CustomizedComparers.ContainsKey(typeof(T)))
{
Comparison<T> comp = CustomizedComparers[typeof(T)];
return comp (a , b);
}
else return Comparer<T>.Default.Compare(a, b);
}
}
欢迎任何意见、建议和见解!谢谢你们。