數據我有一個接口泛型類返回特定的一組取決於類型
兩個類繼承這個接口FetchFromDatabase
和FetchFromCollection
。目的是在注入到另一個類的類之間切換,讓我們把它們放在屏幕上等等。根據使用的類型,我想根據類型從特定集合中獲取數據。在FetchFromDatabase
中實現此功能並不是問題,因爲DbContext
有方法DbContext.Set<>()
,它返回特定的表。
我正在尋找使用集合的方式。在FetchFromCollection
行23:return modules.Set();
,編譯器報告錯誤:
Error 2 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<MainProgram.Models.Module>' to 'System.Collections.Generic.IEnumerable<TEntity>'. An explicit conversion exists (are you missing a cast?)
我不知道該怎麼Module
類轉化爲泛型類型TEntity
。我嘗試使用中級類ModelBase
並繼承到具體的定義,但是接下來我將不得不使用另一個注入級別並自行決定要使用哪個具體類。
我在這裏找到了一些東西Pass An Instantiated System.Type as a Type Parameter for a Generic Class這是使用反射的方式。我仍然困惑如何實現這一點。有什麼建議嗎?
FetchFromDatabase
public class FetchFromDatabase<TEntity> : IFetchData<TEntity>
where TEntity : class
{
private readonly MainDBContextBase context;
public FetchFromDatabase(MainDBContextBase context)
{
if (context == null)
throw new ArgumentNullException("DB context");
this.context = context;
}
public IEnumerable<TEntity> GetItems()
{
return context.Set<TEntity>();
}
}
FetchFromCollection
public class FetchFromCollection<TEntity> : IFetchData<TEntity>
where TEntity : class
{
private readonly InitializeComponents components;
private ModelModules modules;
private ModelSpecializations specializations;
private ModelTeachers techers;
private ModelStudents students;
public FetchFromCollection(InitializeComponents components)
{
if (components == null)
throw new ArgumentNullException("Context");
this.components = components;
}
public IEnumerable<TEntity> GetItems()
{
if (typeof(TEntity) == typeof(Module))
{
if (modules == null)
modules = new ModelModules(components);
return modules.Set();
}
return null;
}
}
爲什麼實現接口泛型的類?你爲什麼不寫:public class FetchFromCollection:IFetchData。 –
但是如果我這樣做,'FetchFromCollection'將只返回一個集合。我想根據類型返回不同的集合,類似於什麼'DbContext <> Set <>。()'does – Celdor
那麼爲什麼你寫「if(typeof(TEntity)== typeof(Module))」?也許你可以詳細說明ModelModules? –