将List <object>转换为List <complex>,其中complex是用户定义的类型</complex> </object>

时间:2011-08-17 00:18:33

标签: c# list casting

所以我想说我有一个像

这样的课程
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中),这就是我选择这样做的方式。可能有更好的方法,但现在我只想知道是否有人知道如何做我要问的方法。

非常感谢你!我希望很清楚我在问什么,如果不是,我会更新问题。

4 个答案:

答案 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);