簡體   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