根据类型返回通用字典

时间:2015-09-14 00:30:53

标签: c# generics

我有一个返回Dictionary的泛型函数。如果Dictionary的键是一个字符串,我想使用String.OrdinalIgnoreCase比较器。

这是我的代码:

    public static Dictionary<K,V> getDict<K,V>()
    {
        Dictionary<K,V> aDict;

        if(typeof(K)==typeof(string)) 
        {
            var stringDict = new Dictionary<string, V>(StringComparer.OrdinalIgnoreCase);
            aDict = (Dictionary<K,V>)stringDict;    // error here - can't convert.
        }
        else aDict = new Dictionary<K, V>();
// do more stuff here
        return aDict;
    }

然而它告诉我它

  

无法将Dictionary<string,V>转换为Dictionary<K,V>

我该怎么做?

3 个答案:

答案 0 :(得分:2)

像这样投射:

aDict = stringDict as Dictionary<K, V>;

答案 1 :(得分:2)

这应该是最适合你的:

var stringDict = new Dictionary<K, V>(
    StringComparer.OrdinalIgnoreCase as IEqualityComparer<K>);

问题在于Dictionary<TKey,TValue> ctor期望IEqualityComparer<T>StringComparer为您提供IEqualityComparer - 非通用品种。一旦你正确地投射了相等比较器,你应该在路上。

下面的测试代码块将触发预期的异常:

var dict = getDict<string, int>();

dict.Add("alpha", 1);
dict.Add("Alpha", 2);  // triggers the expected duplicate key exception.

... HTH

答案 2 :(得分:1)

一种常见的解决方案 - 通过中级演员投射到object

  aDict = (Dictionary<K,V>)(object)stringDict;