2012-03-29 182 views
0

我有3個不同的數據庫表,它們具有相同的5個字段,但沒有任何外鍵關係,因爲它們實際上並沒有保持相同的值,而是等價的;例如:CompanyA表有productA,CompanyB有productB。只使用一種方法,接受不同類型的參數

所以我有3個不同的集合包括3個等效的字段。所以我想要做的是使用一個具有companyType和ProductName屬性的類,並且只使用一個方法將這3個不同的集合轉換爲一個類對象,比如ResultClass。

public class ResultClass 
{ 
    public EnumCompanyType CompanyType { get; set; } 
    public string ProductName { get; set; } 

    public ICollection<ResultClass> ConvertAnything(ICollection<T> collection) 
    { 
     //Cast it to ResultClass 

     return resultClassCollection; 
    } 
} 

所以,我可以用這個像:

ICollection<ProductA> aCollection = GetCompanyAData(); 
ICollection<ProductB> bCollection = GetCompanyBData();   
ConvertAnything(aCollection); 
ConvertAnything(bCollection); 

我已經試過「動態」的,但實際上不知道原則(既沒有知識);所以我搞砸了,我認爲這不適合這個東西。

我試圖創建一個擴展方法,但由於擴展沒有類型的參數(因爲它是使用ICollection的),我無法訪問的項目(如屬性)

領域我使用LinqToSql和所有的數據庫表術語等屬於這個概念,沒有別的。

編輯:

我想我應該自己清楚: ,我試圖避免的(或不應該我,還在想)的多個實例,就像下面

public ICollection<ResultClass> ConvertAnythingForA(ICollection<ProductA> collection) 
    { 
     foreach(var item in collection) 
     { 
      var result = new ResultClass 
          { 
           ProductName = item.ProductA, 
           ProductType = EnumProductType.ProductA 
          }; 

      resultClassCollection.Add(result); 
     } 
     return resultClassCollection; 
    } 

public ICollection<ResultClass> ConvertAnythingForB(ICollection<ProductB> collection) 
    { 
     foreach(var item in collection) 
     { 
      var result = new ResultClass 
          { 
           ProductName = item.ProductB, 
           ProductType = EnumProductType.ProductB 
          }; 

      resultClassCollection.Add(result); 
     } 
     return resultClassCollection; 
    } 

謝謝提前。

回答

2

我可能沒有完全理解你,但因爲產品A,產品B等有好像你想要像

public interface IResultClass 
{ 
    int CompanyType { get; set; } 
    string ProductName { get; set; } 
} 

的接口,並將這些類只是實現的接口相同的簽名。您可以使用可能具有各種類型對象的接口集合。如果您需要任何轉換方法,它看起來像

public ICollection<IResultClass> ConvertAnything<T>(ICollection<T> collection) where T : IResultClass 
    { 
     return collection.Select(x => (IResultClass)x).ToList(); 
    } 

評論 - 我看你,你得到一個非一般的ICollection後。你嘗試這樣的事情:

public ICollection<IResultClass> ConvertAnything(ICollection collection) 
    { 
     var x = collection.Cast<IResultClass>(); 
     return x.ToList(); 
    } 
+0

仿製藥的萬歲! :) – 2012-03-29 01:20:55

+0

是的,我試過這個,因爲我在問題中已經解釋過,但是這種方式既然是通用的,我不能訪問屬性;像集合[0] .ProductName!它們的結構並不完全相同,它們具有不同名稱的列,其值相同 – 2012-03-29 01:23:18

+0

這就是類型約束的原因。如果將其限制在界面上,則可以訪問界面中定義的任何內容。 – Japple 2012-03-29 01:26:29

0

如果兩個數據集是等價的,爲什麼不只是有一個類型,稱爲ICollection的<產品>?還有一個功能,例如。 「GetProductData(」A「)」,其中「A」/「B」是參數?或者我錯過了什麼?

+0

他們有相同的領域和不同的領域,這就是爲什麼他們不是一個單一的表。 – 2012-03-29 01:26:52

+0

好的。您可以創建一個繼承每種類型接口的Product類(例如,IProductA,IProductB等)。那麼ConvertAnything就必須弄清楚每種產品類型應該怎麼做。你可以通過重載來做到這一點(所以它知道提前獲得的產品類型)。或者,您可以自行編寫代碼,並在轉換之前將產品轉換爲適當的類型。 – 2012-03-29 01:31:00

相關問題