2012-03-29 113 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

相关问题