如何在C#中将子对象添加到父泛型类型
作者:互联网
在Java中,我可以使用Generic Type中的extend关键字来做到这一点,但是在C#中,我无法弄清楚.
我有3个班级,其中一个是基班.
public class BaseEntity {
public string Id {get;set;}
}
public class EntityA : BaseEntity {}
public class EntityB: BaseEntity {}
然后我有一个用于数据集的模拟类.对于泛型类型,最小约束是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)
{
}
}
但是,当我要将子类之一添加到项目列表时,编译器说这是不可能的.
Cannot convert From EntityA to T
items.Add(new EntityA());
由于要使用Add,Update和Delete方法,因此我想使用通用类型.
是,如果我使用List< BaseEntity> = new List< BaseEntity>(),那么我将不会收到无法转换的消息.但是在这种情况下,Add,Update和Delete方法将是错误的.
但是我添加了T:BaseEntity这个约束和grr.
我要实现的是T:BaseEntity类型项目列表,其中填充了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)
{
}
}
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);
}
//...
}
现在,EntityADataStore.items将是List< EntityA>.
标签:generic-collections,c 来源: https://codeday.me/bug/20191025/1926468.html