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

C# 如何将子对象添加到c中的父泛型类型#,c#,generic-collections,C#,Generic Collections,在java中,我可以用泛型类型中的extends关键字来实现,但在C#中,我无法理解 我有3个类,其中一个是基类 public class BaseEntity { public string Id {get;set;} } public class EntityA : BaseEntity {} public class EntityB: BaseEntity {} 然后我为dataset创建了一个模拟类。对于泛型类型,最小约束是BaseEntity public class

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

我有3个类,其中一个是基类

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

public class EntityA : BaseEntity {}

public class EntityB: BaseEntity {}
然后我为dataset创建了一个模拟类。对于泛型类型,最小约束是
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)
    {           
    }
}
我想使用泛型类型,因为Add、Update和Delete方法

是,如果我使用
List=new List()
则我将不会收到无法转换的消息。但是在这种情况下,Add、Update和Delete方法将是错误的

但是我添加了
其中T:BaseEntity
这个约束和grr

我想要实现的是,
T:BaseEntity
键入了
items
列表,其中填充了
BaseEntity
的子项


我该怎么做?

我想您有两个选择:

1.删除不需要的泛型。 我认为在类级别不需要泛型。您只需拥有一个基类列表并使用它:

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)
    {           
    }
}
公共类MockDataStore
{
列表项=新列表();
公共异步任务AddAsync(BaseEntity项)
{           
}
公共异步任务UpdateAsync(BaseEntity项)
{           
}
公共异步任务DeleteAsync(BaseEntity项)
{           
}
}
2.通过适当的继承链使用泛型。 这可能不是您想要的,因为最终会有多个类,但我将把它留在这里以防万一:

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);
    }

    //...
}
公共抽象类MockDataStoreBase:IDataStore其中T:BaseEntity
{
受保护的列表项=新列表();
公共虚拟异步任务AddAsync(T项)
{           
}
公共异步任务UpdateAsync(T项)
{           
}
公共异步任务DeleteAsync(T项)
{           
}
}
公共类EntityAdatStore:MockDataStoreBase
{
公共重写异步任务AddAsync(EntityA项)
{
bool result=await base.AddAsync(项);
}
//...
}

现在,
EntityADataStore.items
将成为一个
列表

您在哪里编写
items.Add(newentitya())?在模拟数据存储中
MockDataStore
?如果是,为什么?如果将
where T:BaseEntity
替换为
where T:BaseEntity,new()
,则可以
项。添加(new T())
@CamiloTerevinto,因为我需要一个快速的解决方案:)。如果您希望此数据存储是泛型的,那么不要在该类中使用
new EntityA()
。使用
new MockDataStore()
实例化它,然后在
AddAsync()
中使用
items。添加(item)
。如果不显示它失败的位置,则很难跟踪。
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);
    }

    //...
}