将List <x>转换为List <y>

Jim*_*mbo 11 c# casting list

以下代码有效:

List<JsonStock> stock = new List<JsonStock>();

foreach(tblStock item in repository.Single(id).tblStocks)                
    stock.Add((JsonStock) item);
Run Code Online (Sandbox Code Playgroud)

所以你自然会认为这段代码也会起作用:

List<JsonStock> stock = repository.Single(id).tblStocks.Cast<JsonStock>().ToList()
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误Invalid cast operation- 有人知道为什么会发生这种情况吗?

UPDATE

tblStocks是LINQ to SQL对象的列表,tblStock.
JsonStock是tblStock类的简化版本,并作为JSON对象返回到网页.

构建以下运算符以进行转换:

public partial class tblStock{
    public static explicit operator JsonStock(tblStock stock){
        JsonStock item = new JsonStock
        {
            boxes = stock.boxes,
            boxtype = stock.tblBoxType.name,
            boxtype_id = stock.boxtype_id,
            grade = stock.grade,
            packrate = stock.packrate,
            weight = stock.weight
        };

        return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 6

Cast用于将非泛型集合更改为通用集合,即它执行拆箱操作.它不能以您想要的方式使用.
当你看到它的实现CastCastIterator它使用时,你会看到它需要一个对象并将它强制转换为指定的类型:

foreach (object current in source)
{
    yield return (TResult)current;
}
Run Code Online (Sandbox Code Playgroud)

这只适用于current真的TResult.在这种情况下,不会应用自定义转换.
这是默认行为,您可以自己测试:

double d = 0.0;
object tmp = d;
int i = (int)tmp; // throws the same exception you are getting
Run Code Online (Sandbox Code Playgroud)

你想要的最好用一个简单的Selectif tblStocks是一个通用的可枚举:

List<JsonStock> stock = repository.Single(id).tblStocks
                                  .Select(x => (JsonStock)x).ToList();
Run Code Online (Sandbox Code Playgroud)

或者,如果tblStocks是非通用的可枚举,则需要组合CastSelect:

List<JsonStock> stock = repository.Single(id).tblStocks.Cast<tblStock>()
                                  .Select(x => (JsonStock)x).ToList();
Run Code Online (Sandbox Code Playgroud)

这将首先将对象解包tblStocks为真实类型(tblStock),然后将其转换为您想要的类型(JsonStocks).