无法将通用列表转换为自定义列表类型

Jes*_*ebb 5 .net c# generics collections casting

我有两个班:

public class MyClass
{
    public int Foo { get; set; }
    public string Bar { get; set; }
}

public class MyList : List<MyClass>
{
}
Run Code Online (Sandbox Code Playgroud)

在其他代码中,我正在MyClass为数据库中的每条记录创建实例,我想在MyList实例中返回它们:

var records = _repository.GetRecords();
return (MyList) records.Select(x => x.ConvertTo<MyClass>()).ToList();
Run Code Online (Sandbox Code Playgroud)

代码编译很好,但它抛出一个运行时 InvalidCastException:

无法将类型为'System.Collections.Generic.List`1 [MyClass]'的对象强制转换为'MyList'.

我不明白为什么这个错误是因为发生的事情MyList 一个List<MyClass>.

我发现了一些相关的问题,都是关于协方差的.这个问题与我的问题最相似,但我不知道如何调整答案来解决我的问题.

我的问题:
如何MyList从数据库记录中构建实例?

我正在使用C#和.NET 4.0

D S*_*ley 8

每一个MyList都是一个List<MyClass>,但不是每个List<MyClass>都是一个MyList.例如,如果您有自定义属性MyList,Linq的ToList方法将不知道它.

您可以使用复制构造函数创建MyListList<T>:

return new MyList(records.Select(x => x.ConvertTo<MyClass>()).ToList());
Run Code Online (Sandbox Code Playgroud)

编辑

正如@ekolis庄严地注意到的,你需要明确地"继承" List<T>拷贝构造函数:

public class MyList : List<MyClass>
{
    public MyList(IEnumerable<MyClass> list)
        : base(list)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我也退一步,看看你是否真的需要一个MyList类,或者您也可以只使用List<MyClass>(甚至只是IEnumerable<MyClass>).

  • 请注意,您实际上需要创建此复制构造函数; 它不会从List <T>继承. (2认同)