J'ai un projet avec toutes mes définitions d'interface: RivWorks.Interfaces
J'ai un projet où je définis des implémentations concrètes: RivWorks.DTO
J'ai déjà fait cela des centaines de fois, mais pour une raison quelconque, j'obtiens cette erreur maintenant:
Impossible de convertir implicitement le type «System.Collections.Generic.List <RivWorks.DTO.Product>» en «System.Collections.Generic.List <RivWorks.Interfaces.DataContracts.IProduct>»
Définition d'interface (raccourcie):
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; }
...
}
}
Définition de la classe de béton (raccourcie):
namespace RivWorks.DTO
{
[DataContract(Name = "Product", Namespace = "http://rivworks.com/DataContracts/2009/01/15")]
public class Product : IProduct
{
#region Constructors
public Product() { }
public Product(Guid ProductID)
{
Initialize(ProductID);
}
public Product(string SKU, Guid CompanyID)
{
using (RivEntities _dbRiv = new RivWorksStore(stores.RivConnString).NegotiationEntities())
{
model.Product rivProduct = _dbRiv.Product.Where(a => a.SKU == SKU && a.Company.CompanyId == CompanyID).FirstOrDefault();
if (rivProduct != null)
Initialize(rivProduct.ProductId);
}
}
#endregion
#region Private Methods
private void Initialize(Guid ProductID)
{
using (RivEntities _dbRiv = new RivWorksStore(stores.RivConnString).NegotiationEntities())
{
var localProduct = _dbRiv.Product.Include("Company").Where(a => a.ProductId == ProductID).FirstOrDefault();
if (localProduct != null)
{
var companyDetails = _dbRiv.vwCompanyDetails.Where(a => a.CompanyId == localProduct.Company.CompanyId).FirstOrDefault();
if (companyDetails != null)
{
if (localProduct.alternateProductID != null && localProduct.alternateProductID > 0)
{
using (FeedsEntities _dbFeed = new FeedStoreReadOnly(stores.FeedConnString).ReadOnlyEntities())
{
var feedProduct = _dbFeed.AutoWithImage.Where(a => a.ClientID == companyDetails.ClientID && a.AutoID == localProduct.alternateProductID).FirstOrDefault();
if (companyDetails.useZeroGspPath.Value || feedProduct.GuaranteedSalePrice > 0) // kab: 2010.04.07 - new rules...
PopulateProduct(feedProduct, localProduct, companyDetails);
}
}
else
{
if (companyDetails.useZeroGspPath.Value || localProduct.LowestPrice > 0) // kab: 2010.04.07 - new rules...
PopulateProduct(localProduct, companyDetails);
}
}
}
}
}
private void PopulateProduct(RivWorks.Model.Entities.Product product, RivWorks.Model.Entities.vwCompanyDetails RivCompany)
{
this.ProductID = product.ProductId;
if (product.alternateProductID != null)
this.alternateProductID = product.alternateProductID.Value;
this.BackgroundColor = product.BackgroundColor;
...
}
private void PopulateProduct(RivWorks.Model.Entities.AutoWithImage feedProduct, RivWorks.Model.Entities.Product rivProduct, RivWorks.Model.Entities.vwCompanyDetails RivCompany)
{
this.alternateProductID = feedProduct.AutoID;
this.BackgroundColor = Helpers.Product.GetCorrectValue(RivCompany.defaultBackgroundColor, rivProduct.BackgroundColor);
...
}
#endregion
#region IProduct Members
public Guid ProductID { get; set; }
public long alternateProductID { get; set; }
public Guid CompanyId { get; set; }
...
#endregion
}
}
Dans une autre classe, j'ai:
using dto = RivWorks.DTO;
using contracts = RivWorks.Interfaces.DataContracts;
...
public static List<contracts.IProduct> Get(Guid companyID)
{
List<contracts.IProduct> myList = new List<dto.Product>();
...
Des idées pourquoi cela pourrait se produire? (Et je suis sûr que c'est quelque chose de trivialement simple!)
la source
Vous ne pouvez pas faire ça. Si vous en avez un
List<IProduct>
, vous pouvez en mettre unIProduct
. Donc, si vous avez unProduct2
outil,IProduct
vous pouvez le mettre dans la liste. Mais la liste d'origine a été créée commeList<Product>
, donc toute personne utilisant la liste ne s'attendrait qu'à des objets de typeProduct
, et nonProduct2
à être dans la liste.Dans .NET 4.0, ils ont ajouté la covariance et la contravariance pour les interfaces, afin que vous puissiez convertir
IEnumerable<Product>
enIEnumerable<IProduct>
. Mais cela ne fonctionne toujours pas pour les listes, puisque l'interface de liste vous permet à la fois de "mettre des éléments" et de "sortir des éléments".la source
Juste une remarque: la covariance et la contravariance dans les génériques ont été ajoutées en C # 4.0.
la source
Eh bien, vous pouvez l'utiliser!
Maintenant, pour donner une solution directe,
la source
Voici un petit exemple comment procéder.
la source
Essayez plutôt ceci:
la source