C#接口和通用列表

时间:2010-01-19 21:14:26

标签: c# interface

我的界面定义为:

namespace RivWorks.Interfaces.DataContracts
{
    public interface IProduct
    {
        [XmlElement]
        [DataMember(Name = "ID", Order = 0)]
        Guid ProductID { get; set; }
        [XmlElement]
        [DataMember(Name = "altID", Order = 1)]
        long alternateProductID { get; set; }
        [XmlElement]
        [DataMember(Name = "CompanyId", Order = 2)]
        Guid CompanyId { get; set; }
        ...
        [XmlElement]
        [DataMember(Name = "buttonPositionCSS", Order = 14)]
        string buttonPositionCSS { get; set; }
    }
}

我有一个具体的实现,如:

namespace RivWorks.Model.Objects
{
    [DataContract(Name = "Product", Namespace = "http://rivworks.com/DataContracts/2009/01/15")]
    public class Product : IProduct
    {
        #region Declarations
        private Guid _productID;
        private long _altProductID;
        private Guid _companyId;
        ...
        private string _buttonPositionCSS;
        #endregion

        #region IProduct Members
        public Guid ProductID { get { return _productID; } set { _productID = value; } }
        public long alternateProductID { get { return _altProductID; } set { _altProductID = value; } }
        public Guid CompanyId { get { return _companyId; } set { _companyId = value; } }
        ...
        public string buttonPositionCSS { get { return _buttonPositionCSS; } set { _buttonPositionCSS = value; } }
        #endregion
    }
}

我有另一个接口定义为:

namespace RivWorks.Interfaces.Services
{
    public interface IProductManager
    {
        #region Products
        IProduct GetProductById(Guid productId);
        List<IProduct> GetProductByCompany(Guid companyId);
        int SaveProduct(IProduct product);
        int DeleteProduct(Guid productId);
        #endregion
    }
}

我有一个定义为:

的类
namespace RivWorks.Controller
{
    public class ProductManager : IProductManager
    {
        #region Declare Models
        private static RivWorks.Model.Negotiation.RIV_Entities _dbRiv = RivWorks.Model.Stores.RivEntities(AppSettings.RivWorkEntities_connString);
        private static RivWorks.Model.NegotiationAutos.RivFeedsEntities _dbFeed = RivWorks.Model.Stores.FeedEntities(AppSettings.FeedAutosEntities_connString);
        #endregion

        #region Products
        public IProduct GetProductById(Guid productId)
        {
            // deleted for simplicity sake
            return product;
        }
        public List<IProduct> GetProductByCompany(Guid companyId)
        {
            var company = (from a in _dbRiv.Company where a.CompanyId == companyId select a).First();
            var companyDetails = from a in _dbRiv.AutoNegotiationDetails where a.CompanyId == companyId select a;
            // ################################################## //
            List<IProduct> productList = new List<RivWorks.Model.Objects.Product>();
            // ################################################## //
            // deleted for simplicity sake
            return productList;
        }
        public int SaveProduct(IProduct product)
        {
            return 0;  // stub
        }
        public int DeleteProduct(Guid productId)
        {
            return 0;  // stub
        }
        #endregion
    }
}

我在编译时收到此错误:

  

无法隐式转换类型'System.Collections.Generic.List&lt; RivWorks.Model.Objects.Product&gt;'到'System.Collections.Generic.List&lt; RivWorks.Interfaces.DataContracts.IProduct&gt;'

系统是一个非常服务(WCF,WebOrb等)的系统,我想将Interfaces作为我的合同公开。我有Model&amp; .NET中的控制器,我使用服务作为第三方消费者的视图(代理)(真正的视图)。

我错过了什么或做错了什么?

5 个答案:

答案 0 :(得分:5)

尝试更改:

List<IProduct> productList = new List<RivWorks.Model.Objects.Product>();

要:

List<IProduct> productList = new List<IProduct>();

或者(如果在返回列表之前需要使用List的元素作为具体实现而不是接口):

List<RivWorks.Model.Objects.Product> productList = 
    new List<RivWorks.Model.Objects.Product>();

// Do some work here.

return productList.Cast<IProduct>().ToList();

答案 1 :(得分:4)

您正在创建Product的列表,但它需要IProduct的列表。在这种情况下,这两者是不可互换的(如果有人试图将IProduct添加到 a Product的列表中会怎么样?)

更改

List<IProduct> productList = new List<RivWorks.Model.Objects.Product>();

List<IProduct> productList = new List<IProduct>();

答案 2 :(得分:4)

您需要更改此行:

List<IProduct> productList = new List<RivWorks.Model.Objects.Product>(); 

List<IProduct> productList = new List<IProduct>(); 

由于您返回的接口列表为泛型类型,因此请使用泛型类型实例化列表。

您将能够添加实现它的类。

答案 3 :(得分:1)

您假设Generic List类理解如果您声明IP产品列表,它与产品列表相同。您需要按如下方式声明列表:

List<IProduct> = new List<Iproduct>();

然后您可以添加产品实例。

只有在框架中引入泛型类型的共变和逆差时才能从.net Faramework版本4中完成(在某些情况下)。

答案 4 :(得分:1)

C#中的泛型不能以这种方式工作。

请参阅here

如果B是A的子类,则C < B>不是C&lt;的子类。 A&gt;。