将List <BaseClass>复制到List <DerivedClass>

Ric*_*ett 23 .net c#

给定以下类定义:

public class BaseClass
{
    public string SomeProp1 { get; set; }
}

public class DerivedClass : BaseClass
{
    public string SomeProp2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能List<BaseClass>把它转换成一个List<DerivedClass>

在我的真实世界场景中BaseClass有一大堆属性,我不想一个接一个地复制(然后记得在添加额外属性时进行维护).

添加参数化构造函数BaseClass不是一个选项,因为此类由WCF服务引用定义.

Pet*_*ris 25

List<DerivedClass> result = 
    listBaseClass.ConvertAll(instance => (DerivedClass)instance);
Run Code Online (Sandbox Code Playgroud)

实际上当你需要根据原始对象创建新对象时,ConvertAll是好的,当你只需要施放时你可以使用以下

List<DerivedClass> result = 
    listBaseClass.Cast<DerivedClass>().ToList();
Run Code Online (Sandbox Code Playgroud)

如果不是列表中的所有项目都可以转换为DerivedClass,则使用OfType

List<DerivedClass> result =
    listBaseClass.OfType<DerivedClass>().ToList();
Run Code Online (Sandbox Code Playgroud)

  • "似乎不起作用",我敢打赌,您希望用户提供更好的错误报告,不是吗?使用System.Linq; 你有吗? (3认同)

Jon*_*eet 17

您无法转换实际对象,但可以使用转换后的内容轻松创建新列表:

List<BaseClass> baseList = new List<BaseClass>(...);
// Fill it here...

List<DerivedClass> derivedList = baseList.ConvertAll(b => (DerivedClass) b);
Run Code Online (Sandbox Code Playgroud)

或者,如果您不使用C#3:

List<DerivedClass> derivedList = baseList.ConvertAll<DerivedClass>(delegate
    (BaseClass b) { return (DerivedClass) b; };
Run Code Online (Sandbox Code Playgroud)

这假设原始列表实际上充满了DerivedClass的实例.如果不是这种情况,请更改委托以基于给定的BaseClass创建适当的DerivedClass实例.

编辑:我不知道为什么我不发布LINQ解决方案:

List<DerivedClass> derivedList = baseList.Cast<DerivedClass>().ToList();
Run Code Online (Sandbox Code Playgroud)