我想写一个常用的方法来返回任何模型,如产品,销售等。像这样的东西(.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>
。存在显式转换(您是否错过了演员?)
任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:2)
错误非常明确:TEntity不是产品。在.Net 4.0中,您可以使用协方差来解决此问题,但在.Net 3.5中,您可以执行以下操作:
where TEntity : class
更改为where TEntity : Product
。您已经在方法中假设了这一点,因此编译器可以强制执行它。return fLit.Cast<TEntity>();
答案 1 :(得分:2)
我担心你必须改变域的设计,这不是Repository Pattern要实现的方式。首先,您必须为您的域模型提供一个基类,如下所示(当然这不是必需的):
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);
}
}
这很简洁,所以你可以在这里看到我们期望Rebock类构造函数的DbContext参数。我们还利用我们的实体库的Id属性来查找我们想要的内容。
到目前为止,您实现了Repository模式的基础知识,从现在开始,您需要为每个Domain Entity创建一个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;
}
}
希望得到这个帮助。
答案 2 :(得分:0)
在.NET 3.5中,您无法转换类似的泛型类型。所以只需将您的枚举保存为泛型类型即可。将行更改为:
IEnumberable<TEntity> flit = from p in PRODUCT LIST select p;