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

本文关键字:complex List 定义 类型 用户 转换 其中 object | 更新日期: 2023-09-27 18:05:42

假设我有一个像

这样的类
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 )

我希望用最简单的方式来排列这个列表。一行是最理想的,但是几行也可以。

这是我尝试的(但不工作- 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>)

因此,简单地说,我要求Dictionary<>提供相应的对象列表。然后我尝试将这个列表转换为它应该是什么,这是一个Complex列表。

注意 -请尝试忽略我在运行时这样进行类型转换的事实。我正在反序列化一个XML集合(实际上是在app.config中),这就是我选择的方法。也许有更好的方法,但现在我只想看看有没有人知道我要求的方法。

非常感谢!

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

我希望你明白我的问题,如果不是,我会更新问题。

分解示例代码并稍微修改一下,使用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);
}

List<object>转换为List<Complex>非常简单:

List<object> objectList = complexElementsDictionary["ComplexElementCollection"];
List<Complex> complexList = objectList.Cast<Complex>().ToList();

然而,你不能仅仅因为ComplexCollection继承了List<Complex>就将List<Complex>强制转换为ComplexCollection。(反过来也可以)

List<T>有一个构造函数,它接受一个IEnumerable<T>,并将元素添加到一个列表中。所以我认为你需要的是将这个构造函数添加到ComplexCollection:

public ComplexCollection(IEnumerable<Complex> values) : base(values)
{
    /* plus any other logic you have */
}

然后你的返回语句的例子变成:

return new ComplexCollection(
    complexElementsDictionary["ComplexElementCollection"].Cast<Complex>()
);

要将列表转换为新类型,只需执行如下操作

(ComplexCollection)(yourList.Select(x => (complexType)x).ToList());

这应该可以工作,基本上你遍历字典中的对象列表并将每个项目转换为适当的类型,然后将其转换为列表,然后将列表转换为更具体的集合类型。

恐怕没有直接的解决办法。也许你可以使用ConvertAll:

// ol is of type List<Object>
List<Complex> cl = ol.ConvertAll(o=>(Complex)c);
相关文章: