2012-03-29 3 views
0

У меня есть 3 разных таблицы базы данных, которые имеют одинаковые 5 полей, но у них нет отношения внешнего ключа, поскольку они не сохраняют одинаковое значение на самом деле, но эквиваленты; как: таблица CompanyA имеет productA и CompanyB имеет продуктB.Использовать только один метод, который принимает разные типизированные параметры

поэтому у меня есть 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, и все термины таблицы базы данных и т. Д. Относятся к этой концепции, и ничего больше.

редактировать:

Я думаю, что должен я ясно: The несколько экземпляров, которые я пытаюсь избежать (или не должен я, не думая) как ниже

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

не может понять вас полностью, но так как ProductA, ProductB и т.д. имеют ту же сигнатуру, что кажется, как вы хотели бы интерфейс, как

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(); 
    } 

После comments- я вижу, что вы получаете нон родовое ICollection. Вы попробовали что-то вроде этого:

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

Ура для дженериков! :) –

+0

Да, я пробовал это, как я объяснил в вопросе, но так как это будет общий, я не могу получить доступ к свойствам; как коллекция [0] .ProductName! И они не имеют точно такой же структуры, они имеют именованные по-разному столбцы с эквивалентными значениями –

+0

Вот причина ограничения типа. Если вы ограничиваете его интерфейсом, вы можете получить доступ к чему-либо, определенному в интерфейсе. – Japple

0

Возможно, вы захотите использовать перегрузку функций. В этом примере используется различное количество параметров, но вы можете так же легко использовать разные типы.

http://csharp.net-tutorials.com/classes/method-overloading/

+0

Таким образом, я не создаю 3 точно таких же метода, но создаю единый метод с точно таким же трехкратным содержимым, верно? –

0

Если оба набора данных эквивалентны, поэтому не только один тип, который называется ICollection < продукта >? И одна функция, например. «GetProductData (« A »)», где параметр «A»/«B» является параметром? Или я чего-то не хватает?

+0

у них есть эквивалентные поля и разные поля, поэтому они не являются отдельной таблицей. –

+0

Хорошо. Вы можете создать один класс Product, который наследует интерфейсы для каждого типа (например, IProductA, IProductB и т. Д.).ConvertAnything тогда должен был бы выяснить, что делать для каждого типа продукта. Вы можете сделать это с перегрузкой (чтобы он знал, какой тип продукта он получает заранее). Или вы его кодируете, чтобы понять это сами, и просто переведите продукт в соответствующий тип перед преобразованием. –

Смежные вопросы