如何检索字典<! - ?,? - >中包含的所有键值对?

时间:2009-08-02 19:32:38

标签: c# .net generics reflection

我有一个对象是一个未知类型的词典(即我不知道键和值的类型)

我想检索它的所有值,以便我可以按索引访问它们。

所以我想做的就是这样:

Dictionary<object, object> d = (Dictionary<object, object>)obj; // cast error
l = new List<KeyValuePair<object,object>>();
foreach (KeyValuePair<object, object> k in d)
   l.Add(new KeyValuePair<object,object>(k.Key, k.Value));

但是,正如预期的那样,运行时不会让我转换为Dictionary&lt;对象,对象&gt;。

有没有办法在.net 3.0中执行此操作? (例如使用反射?)

3 个答案:

答案 0 :(得分:15)

由于Dictionary<,>实现IDictionary(非泛型),只需迭代:

    IDictionary data = ...
    foreach (DictionaryEntry de in data)
    {
        Console.WriteLine(de.Key + ": " + de.Value);
    }

答案 1 :(得分:5)

您无法将obj投射到Dictionary<object, object>,因为它不是Dictionary<object, object>。是的,它的键和值来自object,因此可以转换为object。但是你不能在C#中转换泛型类型,因为它们不是协变的。即使T来自objectList<T>也不是来自List<object>

考虑这种方法:

void ModifyList<List<object> list)
{
   for (int i=0; i<list.Count; i++)
   {
      list[i] = list[i].ToString();
   }
}

如果您可以将List<int>投射到List<object>,则可以将List<int>传递给该方法,它会变成其他内容。

当在C#4.0中引入协变泛型时,这将会改变。 This article对所涉及的问题有很好的解释。

但是为了解决你的实际问题,这将解决问题:

List<KeyValuePair<object, object>> list = d.AsEnumerable()
   .Select(x => new KeyValuePair<object, object>(x.Key, x.Value))
   .ToList();

答案 2 :(得分:0)

也许:

foreach (object key in d.keys)
{
 l.Add(new KeyValuePair(key, d[key]);
}