2009-02-03 102 views
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's article甚至源代碼System.Linq.Enumerablereflector但似乎缺少的東西。

這工作:

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

但這並不

extraDataLookup.GetValueOrDefault ("foo") 

,我應該怎麼做。

PS。我只是在尋找解決通用類型推斷問題的方法,而不是其他任何建議。謝謝。

回答

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; 
}  
+0

woops。謝謝。現在像魔術一樣工作 – 2009-02-03 04:39:37