3

我真的很讨厌有时IDictionary<TKey, TValue> [key]如果字典中不存在密钥,将如何抛出异常。

当然有TryGetValue(),但这似乎已经针对性能而非可用性进行了优化。

所以我想,哦,我会为它做一个扩展方法——我做了:

public static class CollectionExtensions
{
    public static TType GetValueOrDefault<TKeyType, TValue, TType>(this IDictionary<TKeyType, TType> dictionary, TKeyType key)
    {
        TType value = default(TType);

        // attempt to get the value of the key from the dictionary
        // if the key doesn't exist just return null
        if (dictionary.TryGetValue(key, out value))
        {
            return value;
        }
        else
        {
            return default(TType);
        }
    }    
}

这很好用,除了我似乎无法让类型推断工作。

显然我希望能够做到以下几点:

var extraDataLookup = new Dictionary<string, string>();
extraDataLookup["zipcode"] = model.Zipcode; 

然后能够访问该值:

var zipcode = extraDataLookup.GetValueOrDefault("zipcode");
var foo = extraDataLookup.GetValueOrDefault("foo"); // should be null

我看过一些关于类型推断的东西,将Jon Skeet 的文章甚至源代码引入System.Linq.Enumerable反射器中,但似乎遗漏了一些东西。

这有效:

extraDataLookup.GetValueOrDefault<string, string,string> ("foo") 

但这不是

extraDataLookup.GetValueOrDefault ("foo") 

我该怎么办。

PS。我只是在寻找通用类型推断问题的解决方案,而不是任何其他建议。谢谢。

4

1 回答 1

5

当您只需要两种时,您似乎正在用三种泛型类型定义您的扩展方法。“TValue”和“TType”的意思是一样的,不是吗?试试这个:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> dictionary, TKey key)
{
    TValue value;
    // attempt to get the value of the key from the dictionary
    dictionary.TryGetValue(key, out value);
    return value;
}    
于 2009-02-03T04:34:06.440 回答