抽象泛型类作为泛型约束

本文关键字:泛型 约束 泛型类 抽象 | 更新日期: 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

但不能识别T1TkeyType

这是一个可能的事情吗?

编辑

@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在评论中所说,您必须在接口定义中定义T1TKeyType,以便您可以传递类型。

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>

您的定义可能是正确的,但是看看您在代码中提供的内容,似乎您正在复制TT1。如果是这种情况,那么去掉T1,只使用T