编程语言
首页 > 编程语言> > 如何在C#中将子对象添加到父泛型类型

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