2012-07-05 113 views
3

類類型現在,我有一個這樣的枚舉:返回基於int值

public enum ReferenceType 
{ 
    Language = 1, 
    Period = 2, 
    Genre = 3 
} 

語言,時期和流派是映射回表在我的數據庫中的所有實體類。我也有模型類,它們將實體類幾乎映射爲1,然後我將它們顯示在視圖中。

我也有這樣的服務方法:

List<Model> Get<Model, Entity>() 
     where Model : BaseModel 
     where Entity : BaseEntity; 

我可以把它像Service.Get<LanguageModel, Language>(),它會從表語言從我的數據庫返回的每一行,並自動將其轉換爲LanguageModels,我將在隨後在我看來顯示。

我想創建圍繞Get()方法,你只需要在一個整數傳遞的包裝方法,它會自動調用我在實體和模型類的類型Get()方法填充。唯一的問題是我很難在這背後的實際實現中包裝我的頭。

的僞代碼將是沿着線:

  1. 呼叫WrapperGet((int)ReferenceType.Genre)
  2. 包裝方法解決實體類型(Genre)和模型類型(GenreModel
  3. 調用Get()方法與解決的實體和模型類型,所以它會Get<GenreModel, Genre>()
  4. 返回結果

我將如何真正在C#中實現這一點?

+0

所以基本上你想有一個通用的存儲庫之後改變它解決此... ORM,你使用的是什麼,是實體框架? – McGarnagle 2012-07-05 21:03:57

+0

是的。我們使用EF 4.0 – 2012-07-05 21:04:24

+0

如果我對你有所瞭解,對於AutoMapper來說,這看起來很不錯,它是一個基於規則的引擎,用於將一個類轉換爲另一個類。 – neontapir 2012-07-05 22:04:02

回答

1

如果你想強類型的結果,你必須放棄傳遞一個int的想法或枚舉的,並切換到直接調用Get或作出這樣的方法:

List<LanguageModel> GetLanguages() { return Get<LanguageModel, Language>(); } 

如果弱類型的工作適合你,那我會用賽義德的解決方案去,但類型需要一點點的變化工作。 Model在你的例子中是一個泛型類型,所以推測他的意思是List<BaseModel>作爲返回類型。但List<LanguageModel>不是List<BaseModel>!您可以通過使其返回IEnumerable<BaseModel>或改變Get返回一個List<BaseModel>,或return new List<BaseModel>(Get<...

2

我想不出一個完整的通用的方式,我認爲最簡單的方法是如下:

List<Model> WrapperGet(int type) 
{ 
    switch (type) 
    { 
     case 1: return Get<LanguageModel, Language>(); 
     .... 
    } 
    return null; 
}