如何在 C# 中将子对象添加到父泛型类型

How can I add child object to the parent generic type in c#

在 java 中,我可以在泛型类型中使用 extends 关键字来实现,但在 C# 中我无法理解。

我有 3 个 classes,其中一个是基础 class。

public class BaseEntity { 
    public string Id {get;set;} 
}

public class EntityA : BaseEntity {}

public class EntityB: BaseEntity {}

然后我有一个模拟数据集 class。对于泛型类型,最小约束是 BaseEntity

public class MockDataStore<T> : IDataStore<T> where T : BaseEntity
{
    List<T> items = new List<T>();

    public async Task<bool> AddAsync(T item)
    {           
    }

    public async Task<bool> UpdateAsync(T item)
    {           
    }

    public async Task<bool> DeleteAsync(T item)
    {           
    }
}

但是当我想将子 class 之一添加到 items 列表时,compailer 说这是不可能的。

Cannot convert From EntityA to T

items.Add(new EntityA());

我想使用通用类型,因为有添加、更新和删除方法。

是的,如果我使用 List<BaseEntity> = new List<BaseEntity>() 那么我将不会收到 cannot convert 消息。但在这种情况下,Add、Update 和Delete 方法将是错误的。

但是我已经添加了 where T : BaseEntity 这个约束和 grr.

我想要实现的是 T : BaseEntity 输入的 items 列表填满了 BaseEntity.

的子项

我该怎么做?

我想你有两个选择:

1。删除不需要的泛型。

我认为您不需要 class 级别的泛型。您可以只拥有一个基列表 class 并使用它:

public class MockDataStore
{
    List<BaseEntity> items = new List<BaseEntity>();

    public async Task<bool> AddAsync(BaseEntity item)
    {           
    }

    public async Task<bool> UpdateAsync(BaseEntity item)
    {           
    }

    public async Task<bool> DeleteAsync(BaseEntity item)
    {           
    }
}

2。通过适当的继承链使用泛型。

这可能不是你想要的,因为你最终会得到多个 classes,但我会把它留在这里以防万一:

public abstract class MockDataStoreBase<T> : IDataStore<T> where T : BaseEntity
{
    protected List<T> items = new List<T>();

    public virtual async Task<bool> AddAsync(T item)
    {           
    }

    public async Task<bool> UpdateAsync(T item)
    {           
    }

    public async Task<bool> DeleteAsync(T item)
    {           
    }
}

public class EntityADataStore : MockDataStoreBase<EntityA>
{
    public override async Task<bool> AddAsync(EntityA item)
    {
        bool result = await base.AddAsync(item);
    }

    //...
}

现在,EntityADataStore.items 将是 List<EntityA>