我想要编写一个通用方法,它返回任何模型,如产品、销售等。类似于此(.net 3.5;我是使用实体框架的而不是)。
public class ProductRepository<TEntity> : IProduct<TEntity>
where TEntity : class
{
public IEnumerable<TEntity> GetProductList(string Type)
{
IEnumerable<Product> fLit = from p in ProductList
select p;
return fLit;
}
}但是我得到了以下错误
不能隐式地将类型
System.Collections.Generic.IEnumerable<Product>‘转换为System.Collections.Generic.IEnumerable<TEntity>。存在显式转换(是否缺少强制转换?)
任何帮助都很感激。提前谢谢。
发布于 2012-01-21 18:05:01
恐怕您必须更改域的设计,这不是存储库模式要实现的方式。首先,您必须为域模型创建一个基类,如下所示(当然,这是不必要的):
public class EntityBase {
public virtual int Id { get; set; }
}然后必须有一个通用的IRepository接口:
public interface IRepository<TEntity> where TEntity : EntityBase {
TEntity FindOne(int id);
}在实现泛型IRepository接口之后,需要有一个具体的Repository类,这个类是从泛型接口继承的,如下所示:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : EntityBase {
private readonly DbContext _dbContext;
private readonly DbSet<TEntity> _dbSet;
public Repository(DbContext dbContext) {
_dbContext = dbContext;
_dbSet = _dbContext.Set<TEntity>();
}
public IQueryable<TEntity> Entities {
get { return _dbSet; }
}
public TEntity FindOne(int id) {
return Entities.FirstOrDefault(t => t.Id == id);
}
}这很好,所以正如您在这里看到的,我们期望Repository类构造函数的DbContext参数。此外,我们还利用实体基的Id属性来确定我们到底想要什么。
到目前为止,您实现了存储库模式的基础,从现在开始,您需要为每个域实体创建一个Repository类。让我们在这里实现您所要求的:
public class ProductRepository : Repository<Product> {
public ProductRepository(DbContext dbContext)
: base(dbContext) {
}
public IEnumerable<Product> GetProductList(string Type) {
IEnumerable<Product> fLit = from p in Entities select p;
return fLit;
}
}希望能帮上忙。
发布于 2012-01-21 17:30:45
错误很明显: TEntity不是产品。在.Net 4.0中,您可以使用协方差来修复这个问题,但在.Net 3.5中,您可以执行以下操作:
where TEntity : class更改为where TEntity : Product。您已经在方法中假设了这一点,所以编译器可以强制执行它。发布于 2012-01-21 17:24:59
在.NET 3.5中,您不能转换这样的泛型类型。因此,只需将您的枚举作为泛型类型。将行更改为:
IEnumberable<TEntity> flit = from p in PRODUCT LIST select p;https://stackoverflow.com/questions/8954941
复制相似问题