我正在尝试编写一个扩展方法,将数据插入到字典字典中,如下所示:
items=Dictionary<long,Dictionary<int,SomeType>>()
到目前为止我所拥有的是:
public static void LeafDictionaryAdd<TKEY1,TKEY2,TVALUE>(this IDictionary<TKEY1,IDictionary<TKEY2,TVALUE>> dict,TKEY1 key1,TKEY2 key2,TVALUE value)
{
var leafDictionary =
dict.ContainsKey(key1)
? dict[key1]
: (dict[key1] = new Dictionary<TKEY2, TVALUE>());
leafDictionary.Add(key2,value);
}
但编译器不喜欢它。声明:
items.LeafDictionaryAdd(longKey, intKey, someTypeValue);
给了我一个类型推断错误。
声明:
items.LeafDictionaryAdd<long, int, SomeType>(longKey, intKey, someTypeValue);
我得到“......不包含...的定义,最好的扩展方法重载有一些无效的参数。
我做错了什么?
答案 0 :(得分:8)
一些创造性的通用用法;-p
class SomeType { }
static void Main()
{
var items = new Dictionary<long, Dictionary<int, SomeType>>();
items.Add(12345, 123, new SomeType());
}
public static void Add<TOuterKey, TDictionary, TInnerKey, TValue>(
this IDictionary<TOuterKey,TDictionary> data,
TOuterKey outerKey, TInnerKey innerKey, TValue value)
where TDictionary : class, IDictionary<TInnerKey, TValue>, new()
{
TDictionary innerData;
if(!data.TryGetValue(outerKey, out innerData)) {
innerData = new TDictionary();
data.Add(outerKey, innerData);
}
innerData.Add(innerKey, value);
}
答案 1 :(得分:2)
尝试使用具体类型:
public static void LeafDictionaryAdd<TKEY1,TKEY2,TVALUE>(this IDictionary<TKEY1, Dictionary<TKEY2,TVALUE>> dict,TKEY1 key1,TKEY2 key2,TVALUE value)
请参阅 Dictionary<TKEY2,TVALUE>
而不是IDictionary<TKEY2,TVALUE>
答案 2 :(得分:2)
我猜这是一个协方差/逆变问题。您的方法签名期望IDcitionaries的IDictionary,但您传递它是Dictionary的IDictionary。尝试在方法签名中使用具体的Dictionary,作为内部词典。
答案 3 :(得分:1)
如果在参数列表中为Extension方法指定IDictionary, 那么你的物品就不会与之相符。
将您的分机更改为
public static void LeafDictionaryAdd<TKEY1,TKEY2,TVALUE>(
this IDictionary<TKEY1, Dictionary<TKEY2,TVALUE>> dict,
TKEY1 key1,
TKEY2 key2,
TVALUE value)
或尝试将您的项目投射到
((IDictionary<long, IDictionary<int, YourType>>)items).LeafDictionaryAdd(l, i, o);