C# 如何将子对象添加到c中的父泛型类型#
在java中,我可以用泛型类型中的extends关键字来实现,但在C#中,我无法理解 我有3个类,其中一个是基类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
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);
}
//...
}