interface IRepository<TEntity,Tid> where TEntity :class
{
int Insert(TEntity entity);
int Delete(TEntity entity);
TEntity GetById(Tid id);
TEntity GetByFilters(TEntity entity);
int Update(TEntity entity);
}
尝试实施
internal class Repository<XYZClass, string> : IRepository<XYZCLass, string>
{
//...All interface methods
}
获得以下错误:
类型参数声明必须是标识符而不是类型
任何建议..
答案 0 :(得分:1)
如果您希望Repository
是非通用的,则需要指定两种类型:
internal class Repository : IRepository<XYZClass, string> { ... }
如果您希望Repository
是通用的,但指定TId
是string
则可以使用
internal class Repository<TEntity> : IRepository<TEntity, string> where TEntity : class
{
//...All interface methods
}
string
是一种类型,而不是泛型类型参数。
答案 1 :(得分:1)
声明应仅包含那些对使用该类的人通用的类型参数。
换句话说,如果您实现IRepository将TEntity参数设置为XYZClass并将TID参数设置为字符串(即具体的类定义),那么您应该具有:
internal class Repository : IRepository<XYZCLass, string>
{
//...All interface methods
}
如果您希望定义一种类型并保留另一种类型,那么:
internal class Repository<TEntity> : IRepository<TEntity, string>
{
//...All interface methods
}
否则,两种类型仍应保持打开状态:
internal class Repository<TEntity,TID> : IRepository<TEntity, TID>
{
//...All interface methods
}
答案 2 :(得分:1)
也许你想要一个基类约束?
internal class Repository<TYourEntity> : IRepository<TYourEntity, string>
where TYourEntity : XyzClass
{
//...All interface methods
}
请注意,此约束意味着满足接口约束(引用类型约束TEntity : class
)。
为了完整起见,对你的意思的其他“合法”解释(也已在其他答案中)是:
// don't constrain generic parameter, just name it TXyz (TXyz is "declared" here)
internal class Repository<TXyz> : IRepository<TXyz, string>
where TXyz : class
{
//...All interface methods
}
和
// make class non-generic (the type XyzClass exists and is declared elsewhere)
internal class Repository : IRepository<XyzClass, string>
{
//...All interface methods
}
答案 3 :(得分:0)
此存储库不是通用的(它是使用具体类参数化的存储库接口的实现):
internal class Repository : IRepository<XYZCLass, string>