我有一个对象是一个未知类型的词典(即我不知道键和值的类型)
我想检索它的所有值,以便我可以按索引访问它们。
所以我想做的就是这样:
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中执行此操作? (例如使用反射?)
答案 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
来自object
,List<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]);
}