抽象泛型类作为泛型约束
本文关键字:泛型 约束 泛型类 抽象 | 更新日期: 2023-09-27 18:10:02
我试图为我的查找对象创建一个通用存储库,并写如下:
public interface ILookupRepository<T> :
IDisposable,
ICanGetAll<T>,
ICanGetById<T, int>
where T: LookUpObject
{
}
ICan...
是为存储库定义粒度操作的接口,这样我就可以使用组合来定义行为
我想限制这个接口只用于我的LookUp对象,所以我使用where T: LookUpObject
约束
这是一个抽象类:
public abstract class LookUpObject<TObject, TKeyType> : IKeyedEntity<TKeyType>
where TObject : class
where TKeyType : struct
{
private TKeyType id;
private string description;
private bool valid;
public TKeyType Id
{
get { return id; }
set { id = value; }
}
public string Description
{
get { return description; }
set { description= value; }
}
public bool Valid
{
get { return valid; }
set { valid= value; }
}
protected LookUpObject()
{
}
}
但是我不知道如何在我的repo类上定义约束:
I try
public interface ILookupRepository<T> :
IDisposable,
ICanGetAll<T>,
ICanGetById<T, int>
where T: LookUpObject<T1, TkeyType> where T1: class
where TkeyType: Type
但不能识别T1
和TkeyType
这是一个可能的事情吗?
编辑
@Grax使用TkeyType代替int key 解决问题
public interface ILookupRepository<T, TkeyType> :
IDisposable,
ICanGetAll<T>,
ICanGetById<T, TkeyType>
where T : LookUpObject<T, TkeyType>
where TkeyType : struct
我猜你想要这个。这基本上是TyCobb与T和T1结合的答案,但我也认为你希望TKeyType是struct,基于你对抽象类的约束,而不是让它从字面上继承类型"Type"。
public interface ILookupRepository<T, TKeyType> :
IDisposable,
ICanGetAll<T>,
ICanGetById<T, int>
where T : LookUpObject<T, TKeyType>
where TKeyType : struct
{
}
现在,如果您的"id"answers"key"实际上是同一段数据,您甚至可能希望这样做。这里假定键的类型为"int"。
public interface ILookupRepository<T> :
IDisposable,
ICanGetAll<T>,
ICanGetById<T, int>
where T : LookUpObject<T, int>
{
}
正如Magus在评论中所说,您必须在接口定义中定义T1
和TKeyType
,以便您可以传递类型。
public interface ILookupRepository<T, T1, TkeyType> :
IDisposable,
ICanGetAll<T>,
ICanGetById<T, int>
where T: LookUpObject<T1, TkeyType> where T1: class
where TkeyType: Type
所以当你实现接口时,传入类型是什么:
public MyPersonRepository : ILookupRepository<Person, MyT1Object, MyType>
您的定义可能是正确的,但是看看您在代码中提供的内容,似乎您正在复制T
和T1
。如果是这种情况,那么去掉T1
,只使用T
。