2010-12-08 1 views
1

Ich habe gerade ein Spiel mit dem Schreiben eines ORM-Projekt in C#.Aufrufen einer generischen Methode, die eine Sammlung von Generika zurückgibt, ohne zu wissen, was der Typ ist? C#

Grundsätzlich habe ich eine Klassenstruktur wie folgt aus:

IDBOperation --- DBReadOperation

DBOperationPool

Grundsätzlich ein DBReadOperation Karten Daten aus der angegebenen Datenbanktabelle zu einer Klasse in meiner Lösung sagen wir zum Beispiel PersonDetails.

Der Code, um dies zu tun, wurde von einer externen Quelle (kann nicht ganz erinnern?), Und im Grunde genommen eine generische Sammlung (Sammlung) zurückgegeben.

Mein DBOperationPool muss in der Lage sein, eine beliebige Anzahl von DBReadOperations zu übernehmen und Ergebnisse für jede von ihnen zu liefern. Die Logik dafür habe ich unten .. aber kann nicht scheinen, um den Code zu arbeiten?

Die Mapping-Klasse auf Generika auch .. so gebaut, wie kann ich die Mapping-Klasse instanziiert von ..

MappingClass<?> mappingInstance = new MappingClass<?>(); 
Collection<?> returnedCollection = mappingInstance.MapData(argument); 

Wie kann ich nach dem Vorbild sein (unter Verwendung von Generika, oder Reflexion, oder irgendetwas) herauszufinden, wo die Fragezeichen in den oben genannten sind? Kann es gemacht werden? Ich habe eine Suche herum und nichts scheint zu diesem genauen Problem verwandt zu sein.

Offensichtlich macht die einfache Route den Pool mit dem Typ, den ich in Richtung Karte zuordnen möchte .. aber der ganze Punkt des Pools ist dass ich DBReadOperation für zB PersonDetails, CompanyDetails usw. dorthin werfen kann, und die Daten dort, wo sie benötigt werden, zugeordnet werden und die Ergebnisse für jeden Typ korrekt zurückgeben. Mit dieser Route kann ich eine beliebige Anzahl von DBReadOperations in einen Pool werfen, solange sie sich mit einem bestimmten Typ für jede DBOperationPool-Instanz beschäftigen. Aber das ist nicht das, was ich will.

Macht das überhaupt Sinn?

Grüße,

Simon

+0

Vielleicht Objekt als Generika Typ Argument und dann Casxing zu was auch immer Sie brauchen? (Es ist eine Art von tötet das Konzept der Generika, aber es sollte funktionieren) – Machinarius

Antwort

2

Machen MappingClass einige Schnittstelle implementieren, IMappingClass, dann auf, dass überall finden, dass Sie halten nicht wissen, was die allgemeine geben wird.

public interface IMappingClass { 
    public void DoStuff(); 
} 

public class MappingClass<T> : IMappingClass { 
    // stuff 
} 

// ... elsewhere ... 

public void DoMappingStuff(IMappingClass map){ 
    map.DoStuff(); 
    // do other stuff... 
} 

// ... 

MappingClass<string> myStringMap = new MappingClass<string>(); 
DoMappingStuff(myStringMap); 

MappingClass<int> myIntMap = new MappingClass<int>(); 
DoMappingStuff(myIntMap); 
+0

Keine Optionen wirklich mit meinem Problem - das ist meine Schuld, ich habe es schlecht erklärt. – Simon

+0

Whoops, bemerkte nicht, geben Sie Ihren Kommentar einreichen! Wie auch immer, ich habe im Grunde versucht, das dynamische Schlüsselwort zu verwenden, um die Dinge auszuarbeiten .. aber es wirft ein 'enthält keine Definition für' Fehler .. das ist, was ich versuche .. GetPropertyMapper gibt einen PropertyMapper Objekt zurück, das DEFINITIV eine MapAll-Methode enthält. Warum würde es einen Fehler ausgeben? – Simon

2

Kann Ihre DBReadOperation-Klasse generisch sein? Was bedeutet, DBReadOperation<T> und dann instanziieren Sie es mit:

var dbReadOperation = new DBReadOperation<PersonDetails>(); 

Die MappingClass in einem DBReadOperation nehmen würde und T. zurückkehren Es verwendet wie könnte:

var mapper = new MappingClass<DBReadOperation<PersonDetails>>(); 
Collection<PersonDetails> collection = mapper.MapData(someArgument); 
Verwandte Themen