1

我是 C# 的新手,并且坚持以下内容。我有一个使用 LINQ 查询 ADO.NET 实体对象的 Silverlight Web 服务。例如:

[OperationContract]
public List<Customer> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select rec;
        return data.ToList();
    }
}

这很好用,但我想做的是让它更抽象。第一步是返回 a 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?)

我究竟做错了什么?

谢谢,

阿杰

4

5 回答 5

3

即使Customer继承自EntityObjectList<Customer>也不继承自List<EntityObject>,因为不支持泛型类型协变(在 C# 4.0 中,接口支持协变,但不支持IList<T>)。

如果您可以将 a 分配给List<Customer>type 的变量List<EntityObject>,它将允许您执行以下操作:

List<EntityObject> list = new List<Customer>();
list.Add(new Product()); // assuming Product inherits from EntityObject

这段代码显然被破坏了:你不能将 a 添加Product到 a List<Customer>。这就是为什么不允许

于 2010-03-29T12:06:28.537 回答
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 中全面引入

于 2010-03-29T12:06:39.373 回答
0

您的 var 数据包含客户对象,您的返回是带有 EntityObjects 的列表。

你必须投射它们:

data.ConvertAll(obj => (EntityObject) obj).ToList();
于 2010-03-29T12:07:11.560 回答
0

你可以做

data.Cast<EntityObject>().ToList();
于 2010-03-29T12:22:05.150 回答
0

除了data.Cast<EntityObject>().ToList();,您可能需要将派生类型定义为已知类型,因此 WCF 将知道如何序列化派生对象。

http://msdn.microsoft.com/en-us/library/ms730167.aspx

于 2010-03-29T13:20:26.580 回答