C#ジェネリックとデリゲートについて質問があります:
最初に一般的な質問について説明します---デリゲートのコレクションが必要です。これらのデリゲートは同様の形式である必要があります。たとえば、すべてのデリゲートは次の形式である必要があります。同じタイプの2つのパラメーターを取得し、intを返します。これらのデリゲートをモデル化する最良の方法は、ジェネリックデリゲートを使用することだと思います。
public delegate int MyFunctionDel <T> (T a, T b);
しかし、どうすれば異なるタイプのMyFunctionDelのコレクションを作成できますか?私はこれを宣言することはできません:
List<MyFunctionDel <T>> mylist; //Compile error: cannot find type T
そして第二に、これが私が実際にやろうとしていることです。私がやろうとしていることは、上記の質問で解決できます。しかし、あなたは別の解決策を与えることができます。
コレクションのような構造を作成しました。これは、あらゆるタイプのデータを保持できます。ただし、構造内のすべてのデータは同じタイプである必要があります。残念ながら、この構造は歴史的な理由から一般的ではありません。この構造にはCompareメソッドがあります。
しかし今、私はいくつかの特定のタイプのためにカスタマイズされた比較器を提供する必要があります。そして、私が望む動作は次のとおりです。構造には、データのタイプに対応するものがある場合はカスタマイズされた比較器が使用され、それ以外の場合は元のCompareメソッドが使用されます。これが私のデモコードです:
/*
*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);
}
}
コメント、提案、洞察は大歓迎です!君たちありがとう。