我的界面定义为:
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中的控制器,我使用服务作为第三方消费者的视图(代理)(真正的视图)。
我错过了什么或做错了什么?
答案 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)