我正在.NET 2.0框架中工作。我有一些代碼工作,只是希望它更加優雅一點。在通用方法中獲得更復雜類型的適當類型推斷
我有一個需要有效地「鏡子」 Dictionary對象,例如,如果我們有這樣的
Dictionary<TKey,TValue> StartDictionary;
的對象開始,我們可以鏡像像這樣
Dictionary<TValue,TKey> MirroredDictionary = MirrorDictionary(StartDictionary);
,我們將結束在每個KeyValuePair上都要交換一個新的字典,每個KeyValuePair都被交換。在任何人問我爲什麼之前,源字典相當大並且從re加載一次當我的程序加載時,flection調用。我不想再次運行相同的反射調用來加載鏡像字典。創建一個鏡像字典並按照我提出的方式填充它的值和密鑰在我看來似乎成本更低。
因此,作爲一種討厭重寫事物的人,我決定在助手類中編寫泛型方法,我必須使用泛型來完成鏡像。
現在想起你,我以前也寫過簡單的通用方法一般標量類型
這就是我想出了
public static TOutDic MirrorDictionary<TInDic, TOutDic>(TInDic InDictionary)
where TInDic : IDictionary
where TOutDic : IDictionary
{
Type[] KVPTypes = typeof(TInDic).GetGenericArguments();
Type TKey = KVPTypes[0];
Type TValue = KVPTypes[1];
Type TDic = typeof(Dictionary<,>).MakeGenericType(TValue, TKey);
IDictionary OutDic = (IDictionary)Activator.CreateInstance(TDic);
foreach (DictionaryEntry DE in (IDictionary)InDictionary) OutDic.Add(DE.Value, DE.Key);
return (TOutDic)OutDic;
}
一點點的存在,但它的工作原理,加載了的類型鍵和值並創建鏡像字典的實例
然後只循環遍歷InDictionary的基本DictionaryEntries,它將項目添加到OutDic並返回它將其轉換爲預期的類型
編譯就好現在
當我去調用它,我會在我所說的通用方法,我可以只使用我們的代碼標量型覺得就像snippits上面說
Dictionary<TValue,TKey> MirroredDictionary = MirrorDictionary(StartDictionary);
但是,不編譯給我
方法MirrorDictionary(TInDic)'的類型參數不能從用法推斷。嘗試明確指定類型參數。
所以,如果我把它而不是像這樣
Dictionary<TValue, TKey> MirrorDic = MirrorDictionary<Dictionary<Tkey, TValue>, Dictionary<TValue,TKey>>(StringDic);
它編譯和作品就像一個魅力。
現在的問題變成如何正確地推斷傳入此方法的類型時傳入的類型和傳出的類型是複雜的類型,如在此示例中?
它如何可以推斷TOutDic當輸入參數僅供TInDic類型的信息? – 2010-10-26 17:27:20