2015-10-03 81 views
0

數據我有一個接口泛型類返回特定的一組取決於類型

​​

兩個類繼承這個接口FetchFromDatabaseFetchFromCollection。目的是在注入到另一個類的類之間切換,讓我們把它們放在屏幕上等等。根據使用的類型,我想根據類型從特定集合中獲取數據。在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; 
    } 
} 
+1

爲什麼實現接口泛型的類?你爲什麼不寫:public class FetchFromCollection:IFetchData 。 –

+0

但是如果我這樣做,'FetchFromCollection'將只返回一個集合。我想根據類型返回不同的集合,類似於什麼'DbContext <> Set <>。()'does – Celdor

+0

那麼爲什麼你寫「if(typeof(TEntity)== typeof(Module))」?也許你可以詳細說明ModelModules? –

回答

1

你嘗試明確的轉換?

return (IEnumerable<TEntity>)modules.Set(); 
+0

由於某種原因,我以前嘗試過的時候給了我錯誤。這就是我提出這個問題的原因。當我重新構建解決方案時,錯誤消失。謝謝。問題是有沒有更好的方法來做到這一點?我不認爲我創造的是最漂亮的方式: – Celdor