2012-03-29 5 views
0

Ich habe 3 verschiedene Datenbanktabellen, die die gleichen 5 Felder haben, aber diese haben keine Fremdschlüsselbeziehung, da sie nicht den gleichen Wert in der Tat, aber die Äquivalente; wie: CompanyA Tabelle hat productA und CompanyB hat productB.Verwenden Sie nur eine Methode, die verschiedene typisierte Parameter akzeptiert

so habe ich 3 verschiedene Sammlungen gehören 3 Felder, die gleichwertig sind. Also möchte ich eine einzelne Klasse mit den Eigenschaften companyType und ProductName verwenden und nur eine Methode verwenden, um diese 3 verschiedenen Sammlungen in ein einziges Klassenobjekt umzuwandeln, sagen wir 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; 
    } 
} 

Damit ich dies wie verwenden:

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

Ich habe versucht, „dynamisch“, aber eigentlich nicht wissen, das Prinzip (weder über das Wissen); also habe ich es vermasselt und ich denke es ist nicht für dieses Zeug.

Ich habe versucht, eine Erweiterungsmethode zu schaffen, aber da die Erweiterung keinen Typen für seine Parameter hat (wie es ICollection verwendet), kann ich keinen Zugriff auf die Felder der Elemente (z. B. Eigenschaften)

Ich benutze LinqToSql und alle Begriffe der Datenbanktabelle gehören zu diesem Konzept, sonst nichts.

edit:

Ich glaube, ich sollte mich klar gemacht: mehrere Instanzen, die ich zu vermeiden, bin versucht (oder sollte ich nicht, denken noch) wie unten

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

Dank im Voraus.

Antwort

2

ich verstehen Sie nicht vollständig sein kann, aber da ProduktA, ProduktB usw. haben die gleiche Signatur es scheint, wie Sie diese Klassen implementieren nur die Schnittstelle eine Schnittstelle wie

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

Und haben wollen würde. Sie könnten mit Auflistungen der Schnittstelle arbeiten, die Objekte der verschiedenen Typen enthalten können. Wenn Sie ein etwas Methode konvertieren müssen, würde es aussehen

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

Nach Kommentare- ich Sie sehen, dass Sie eine nicht generische ICollection bekommen. Haben Sie etwas wie folgt versucht:

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

Hurra für Generika! :) –

+0

Ja, ich habe das versucht, wie ich in der Frage erklärte, aber so, da es ein generisches sein wird, kann ich nicht auf die Eigenschaften zugreifen; wie Sammlung [0] .ProductName! Und sie haben nicht genau dieselbe Struktur, sie haben anders benannte Spalten mit äquivalenten Werten –

+0

Das ist der Grund für die Typenzwang. Wenn Sie es auf die Schnittstelle beschränken, können Sie auf alles zugreifen, das in der Schnittstelle definiert ist. – Japple

0

Sie können Funktionsüberladung verwenden. In diesem Beispiel werden unterschiedliche Parameter verwendet, Sie können jedoch auch einfach andere Typen verwenden.

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

+0

so, ich erstelle nicht 3 genau die gleichen Methoden, sondern eine einzige Methode mit genau gleichen verdutzten Inhalt, bin ich richtig? –

0

Wenn beide Datensätze gleichwertig sind, warum haben nicht nur eine Art ICollection <Produkt> genannt? Und eine Funktion, z. "GetProductData (" A ")", wobei "A"/"B" der Parameter ist? Oder fehlt mir etwas?

+0

sie haben äquivalente Felder und verschiedene Felder, deshalb sind sie keine einzige Tabelle. –

+0

Ok. Sie könnten eine einzelne Produktklasse erstellen, die Schnittstellen für jeden Typ erbt (z. B. IProductA, IProductB usw.).ConvertAnthing müsste dann herausfinden, was für jeden Produkttyp zu tun ist. Sie könnten dies mit Überladung tun (damit es weiß, welchen Produkttyp es im Voraus erhält). Oder Sie codieren es, um es selbst herauszufinden und das Produkt vor der Konvertierung einfach auf den entsprechenden Typ zu übertragen. –