如何检索Dictonary <?,?>中包含的所有KeyValuePairs?

Bra*_*ann 3 .net c# 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));
Run Code Online (Sandbox Code Playgroud)

但是,正如预期的那样,运行时不会让我转换为Dictionary <object,object>.

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

Mar*_*ell 15

Dictionary<,>implements IDictionary(非泛型),只需迭代:

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


Rob*_*ney 5

你不能强制转换obj为a,Dictionary<object, object>因为它不是a Dictionary<object, object>.是的,它的键和值来源于object,因此可以投射到object.但是你不能在C#中转换泛型类型,因为它们不是协变的.即使T衍生自object,List<T>也不源自List<object>.

考虑这种方法:

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

如果你能投List<int>List<object>,你可以传递List<int>给方法,它会变成别的东西.

当在C#4.0中引入协变泛型时,这将会改变. 本文对所涉及的问题进行了很好的解释.

但要解决您的实际问题,这将解决问题:

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

  • 有关信息; C#4.0协方差对于`List <T>`(也不是`IList <T>`,也没有任何字典类型)都没有区别; 只有更简单的东西,如`IEnumerable <T>`和`Func <...>`类型; http://marcgravell.blogspot.com/2009/02/what-c​​-40-covariance-doesn-do.html (2认同)