我是C#的新手,我坚持下面的内容。我有一个Silverlight Web服务,它使用LINQ来查询ADO.NET实体对象。 e.g:
[OperationContract]
public List<Customer> GetData()
{
using (TestEntities ctx = new TestEntities())
{
var data = from rec in ctx.Customer
select rec;
return data.ToList();
}
}
这很好用,但我想做的是让它更抽象。第一步是返回List<EntityObject>
,但这会产生编译错误,例如:
[OperationContract]
public List<EntityObject> GetData()
{
using (TestEntities ctx = new TestEntities())
{
var data = from rec in ctx.Customer
select rec;
return data.ToList();
}
}
错误是:
Error 1 Cannot implicitly convert type 'System.Collections.Generic.List<SilverlightTest.Web.Customer>' to 'System.Collections.Generic.IEnumerable<System.Data.Objects.DataClasses.EntityObject>'. An explicit conversion exists (are you missing a cast?)
我做错了什么?
谢谢,
AJ
答案 0 :(得分:3)
即使Customer
继承自EntityObject
,List<Customer>
也不会继承List<EntityObject>
,因为不支持通用类型协方差(在C#4.0中,支持协方差接口,但不适用于IList<T>
)。
如果您可以将List<Customer>
分配给List<EntityObject>
类型的变量,则可以执行以下操作:
List<EntityObject> list = new List<Customer>();
list.Add(new Product()); // assuming Product inherits from EntityObject
此代码显然已损坏:您无法将Product
添加到List<Customer>
。这就是为什么不允许
答案 1 :(得分:0)
[OperationContract]
public List<EntityObject> GetData()
{
using (TestEntities ctx = new TestEntities())
{
var data = from rec in ctx.Customer
select (EntityObject)rec;
return data.ToList();
}
}
即使D派生自B,也无法将List转换为List。它被称为协方差,仅适用于数组。它将在C#4.0中全面介绍
答案 2 :(得分:0)
您的var数据包含Customer对象,您的返回是包含EntityObjects的列表。
你必须施展它们:
data.ConvertAll(obj => (EntityObject) obj).ToList();
答案 3 :(得分:0)
你可以做到
data.Cast<EntityObject>().ToList();
答案 4 :(得分:0)
除data.Cast<EntityObject>().ToList();
之外,您可能需要将已派生类型定义为已知类型,因此WCF将知道如何序列化派生对象。