如何在 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>
。
在 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>
。