通用列表类型转换问题

时间:2010-03-29 11:57:43

标签: c# linq silverlight ado.net-entity-data-model

我是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

5 个答案:

答案 0 :(得分:3)

即使Customer继承自EntityObjectList<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将知道如何序列化派生对象。

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