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
每一个MyList都是一个List<MyClass>,但不是每个List<MyClass>都是一个MyList.例如,如果您有自定义属性MyList,Linq的ToList方法将不知道它.
您可以使用复制构造函数创建新MyList的List<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>).
| 归档时间: |
|
| 查看次数: |
5592 次 |
| 最近记录: |