2010-12-08 5 views
1

Je ne fais que jouer avec l'écriture d'un projet de type ORM en C#.Invoquer une méthode générique qui renvoie une collection de génériques sans connaître le type? C#

Fondamentalement, j'ai une structure de classe comme ceci:

IDBOperation --- DBReadOperation

DBOperationPool

Fondamentalement, une donnée de cartes de DBReadOperation de la table de base de données spécifiée à une classe dans ma solution , disons par exemple PersonDetails.

Le code pour ce faire a été pris à partir d'une source externe (ne se souvient pas?), Et retourne fondamentalement une collection générique (Collection). Mon DBOperationPool doit être capable de prendre n'importe quel nombre de DBReadOperation et de renvoyer des résultats pour chacun d'entre eux.

La logique de ce que j'ai baissé .. mais n'arrive pas à faire fonctionner le code?

La classe de cartographie est également construit sur les génériques .. alors comment puis-je instancier la classe de cartographie pour être le long des lignes de ..

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

Comment puis-je (en utilisant des génériques, ou la réflexion, ou quoi que ce soit) comprendre ce qu'il faut mettre où les points d'interrogation sont dans le ci-dessus? Peut-il être fait? J'ai eu une recherche autour et rien ne semble être lié à ce problème exact ..

Évidemment, l'itinéraire facile fait de la piscine le type que je veux mapper vers .. mais le point entier de la piscine est que je peux y lancer DBReadOperation, par exemple, PersonDetails, CompanyDetails, etc, et que les données sont mappées là où elles doivent être et renvoyer les résultats correctement pour chaque type. Avec cette route, je peux lancer n'importe quel nombre de DBReadOperations dans un pool, tant qu'ils traitent un type spécifique pour chaque instance DBOperationPool .. mais ce n'est pas ce que je veux ..

Cela a-t-il du sens?

Cordialement,

Simon

+0

en utilisant peut-être l'objet comme argument de type générique et puis en cascade à tout ce dont vous avez besoin? (Il tue un peu le concept de génériques, mais cela devrait fonctionner) – Machinarius

Répondre

2

Faire MappingClass mettre en œuvre une interface, IMappingClass, puis reportez-vous à ce que partout vous ne savez pas quel type le détiendra générique.

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

Aucune des options ne traite vraiment de mon problème -> c'est de ma faute, je l'ai mal expliqué .. – Simon

+0

Oups, ne s'est pas rendu compte que soumet votre commentaire! Quoi qu'il en soit, j'ai essentiellement essayé d'utiliser le mot-clé dynamique pour résoudre les problèmes .. mais son lancement une erreur 'ne contient pas de définition pour' .. c'est ce que je tente ..GetPropertyMapper renvoie un objet PropertyMapper qui contient DEFINITIVEMENT une méthode MapAll. Pourquoi une erreur se produirait-elle? – Simon

2

Votre classe DBReadOperation peut-elle être générique? Signification, DBReadOperation<T> puis vous instancier avec:

var dbReadOperation = new DBReadOperation<PersonDetails>(); 

Le MappingClass prendrait dans un DBReadOperation et retourner un T. Il pourrait être utilisé comme:

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