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)
你不能强制转换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)