所以我想说我有一个像
这样的课程public class Complex { } // this is what I mean when I say List<Complex>
// its just a user-defined class or type if you will
现在假设我有一个返回保存对象的列表的方法。
现在让我说我可以进一步保证列表中的每个对象实际上都是Complex类型(换句话说List&lt; Complex&gt;)
我希望尽可能以最轻松的方式投射此列表。单线是理想的,但是几条线也可以。
这是我尝试的(但不起作用 - InvalidCastOperation异常):
// Sorry this is so hard to read! Also .Cast<Complex>() doesn't work either :(
return (ComplexCollection) ((List<Complex>) ((List<object>) complexElementsDictionary["ComplexElementCollection"]).OfType<Complex>());
有关此代码段的一些细节:
ComplexCollection inherits List<Complex>
complexElementsDictionary is of type (Dictionary<string, List<object>)
所以简单地说我要问一个字典&lt;&gt;用于其对应的对象列表。然后我尝试将此列表转换为它应该是什么,这是一个复杂的列表。
注意 - 请尝试忽略我在运行时这样投射的事实。我正在反序列化XML集合(实际上是在app.config中),这就是我选择这样做的方式。可能有更好的方法,但现在我只想知道是否有人知道如何做我要问的方法。
非常感谢你!我希望很清楚我在问什么,如果不是,我会更新问题。
答案 0 :(得分:3)
分解您的示例代码并稍微修改它以使用Cast():
List<object> list = complexElementsDictionary["ComplexElementCollection"];
List<Complex> typedList = list.Cast<Complex>().ToList();
您现在拥有所需类型的对象列表。但你真正想要的是你的集合对象的一个实例,这是另一个演员无法获得的。也就是说,你不能这样做:
ComplexCollection collection = (ComplexCollection)typedList;
因为typedList不是ComplexCollection
的实例,并且编译器没有转换运算符可以从List<Complex>
转换为ComplexCollection
。
您需要创建实例并将Complex对象添加到其中:
ComplexCollection collection = new ComplexCollection();
foreach(Complex c in typedList){
collection.Add(c);
}
或仅仅四行:
ComplexCollection collection = new ComplexCollection();
foreach(Complex c in complexElementsDictionary["ComplexElementCollection"].Cast<>(Complex)){
collection.Add(c);
}
答案 1 :(得分:2)
将List<object>
转换为List<Complex>
非常简单:
List<object> objectList = complexElementsDictionary["ComplexElementCollection"];
List<Complex> complexList = objectList.Cast<Complex>().ToList();
但是,由于List<Complex>
继承自ComplexCollection
,您无法将ComplexCollection
转换为List<Complex>
。 (相反,其他方式很好)
List<T>
有一个构造函数,它接受IEnumerable<T>
并将元素添加到列表中。所以我认为你需要的是将这个构造函数添加到ComplexCollection
:
public ComplexCollection(IEnumerable<Complex> values) : base(values)
{
/* plus any other logic you have */
}
然后使用return语句的示例变为:
return new ComplexCollection(
complexElementsDictionary["ComplexElementCollection"].Cast<Complex>()
);
答案 2 :(得分:0)
要将列表转换为新类型,您可以执行简单的操作
(ComplexCollection)(yourList.Select(x => (complexType)x).ToList());
这应该有用,基本上你会浏览字典中的对象列表并将每个项目转换为适当的类型,然后将其转换为列表,然后将列表转换为更具体的集合类型。
答案 3 :(得分:0)
我已经哭了没有直接解决方案。也许你可以使用ConvertAll:
// ol is of type List<Object>
List<Complex> cl = ol.ConvertAll(o=>(Complex)c);