如何在c#

时间:2018-05-22 11:05:21

标签: c# generic-collections

在java中,我可以使用通用类型中的extends关键字,但在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)
    {           
    }
}

但是当我想将其中一个子类添加到items列表时,分析师说这是不可能的。

  

无法从EntityA转换为T

items.Add(new EntityA());

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

是的,如果我使用List<BaseEntity> = new List<BaseEntity>(),那么我将无法获得无法转换消息。但在这种情况下,添加,更新和删除方法将是错误的。

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

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

我该怎么做?

1 个答案:

答案 0 :(得分:4)

我认为你有两种选择:

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>