以下代码有效:
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)
Cast用于将非泛型集合更改为通用集合,即它执行拆箱操作.它不能以您想要的方式使用.
当你看到它的实现Cast和CastIterator它使用时,你会看到它需要一个对象并将它强制转换为指定的类型:
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是非通用的可枚举,则需要组合Cast并Select:
List<JsonStock> stock = repository.Single(id).tblStocks.Cast<tblStock>()
.Select(x => (JsonStock)x).ToList();
Run Code Online (Sandbox Code Playgroud)
这将首先将对象解包tblStocks为真实类型(tblStock),然后将其转换为您想要的类型(JsonStocks).