我有一个名为:的通用类存储库GenericRepository,还有一个名为:的通用接口,IGenericRepository并且Product是数据库中的表之一。
当我通过这种方式将“工作单元”与此通用存储库一起使用时:
public class UnitOfWork: IDisposable
{
GroceryStore_DBEntities db = new GroceryStore_DBEntities();
private IGenericRepository<Product> _genericRepository;
public IGenericRepository<Product> GenericRepository
{
get
{
if (_genericRepository == null)
{
_genericRepository = new GenericRepository<Product>(db);
}
return _genericRepository;
}
}}
Run Code Online (Sandbox Code Playgroud)
我遇到2个错误,您可以在下面看到:
错误CS0311类型'GroceryStore.DataLayer.Context.Product'不能用作通用类型或方法'GenericRepository <TEntity>'中的类型参数'TEntity'。没有从'GroceryStore.DataLayer.Context.Product'到'GroceryStore.DataLayer.Repositories.IGenericRepository <GroceryStore.DataLayer.Context.Product>'的隐式引用转换。
无法将类型'GroceryStore.DataLayer.Services.GenericRepository <GroceryStore.DataLayer.Context.Product>'隐式转换为'GroceryStore.DataLayer.Repositories.IGenericRepository <GroceryStore.DataLayer.Context.Product>'。存在显式转换(您是否缺少演员表?)
你能告诉我我哪里出问题了吗?为什么?以及我该如何解决?
我有以下声明:
public interface IGenericRepository<TEntity>
where TEntity: class
{ }
public class GenericRepository<TEntity>
where TEntity: class, IGenericRepository<TEntity>
{ }
Run Code Online (Sandbox Code Playgroud)
你写了:
public interface IGenericRepository<TEntity>
where TEntity: class
{ }
public class GenericRepository<TEntity>
where TEntity:class, IGenericRepository<TEntity>
{ }
Run Code Online (Sandbox Code Playgroud)
这意味着TEntity中的GenericRepository<TEntity>必须是实体的存储库。
这种约束是合法的,但通常用于
class SortedList<T> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
也就是说,T的排序列表要求T与其他T相当。
我想你的意图是
public class GenericRepository<TEntity> :
IGenericRepository<TEntity>
where TEntity:class
{ }
Run Code Online (Sandbox Code Playgroud)
对?基类和接口的列表位于约束之前。您将其置于约束中。
也就是说,类声明如下所示:
class ClassName<T> :
BaseClass,
IInterface1,
IInterface2
where
T : CONSTRAINT,
CONSTRAINT,
...
Run Code Online (Sandbox Code Playgroud)
约束也必须按照正确的顺序排列。如果对类声明的语法有疑问,请阅读C#规范。您似乎对事情发生的顺序有些困惑。