繁体   English   中英

如何在 C# 中将子对象添加到父泛型类型

[英]How can I add child object to the parent generic type in c#

在 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. 删除不需要的泛型。

我认为您在课堂级别不需要泛型。 您可以只拥有一个基类列表并使用它:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM