2012-11-02 1 views
3

Ce que je veux faire est quelque chose comme ce qui suit (toutes les classes d'objets ont une interface commune):définition de classe magasin dans le dictionnaire, par exemple plus tard

MyDict.Add("A", MyAObjectClass); // Not an instance 
MyDict.Add("B", MyBObjectClass); 
MyDict.Add("C", MyCOjbectClass); 
String typeIwant = "B"; // Could be passed to a function or something 
MyCommonInterface myobject = MyDict[typeIwant](); 

Comment pourrais-je programmer quelque chose comme ça?

Le but de ceci est de ne pas avoir à créer des instances de chaque type que je vais stocker dans mon dictionnaire (peut-être un peu d'entre eux) et à la place seulement celui que je vais utiliser.

Répondre

5

Vous pouvez stocker des informations de type avec un objet Type:

var dict = new Dictionary<String, Type>(); 

dict.Add("A", typeof(TextBox)); 
dict.Add("B", typeof(Button)); 

et de créer des objets comme ceci:

object a = Activator.CreateInstance(dict["A"]); 

Cela ne fonctionne qu'avec les modèles avec un constructeur parameterless. Par exemple, new TextBox(). Si vos types ont des constructeurs qui prennent les mêmes arguments, vous pouvez ajouter les arguments après dict["A"] ou passer un tableau.

3

Je recommande fortement d'utiliser une bibliothèque d'injection de dépendance comme Unity ou Windsor Castle, mais si vous devez absolument, alors vous devriez faire quelque chose comme ceci:

Dictionary<string, System.Type> MyDict = new Dictionary<string, System.Type>(); 
MyDict.Add("A", typeof(MyAObjectClass)); 
MyDict.Add("B", typeof(MyBObjectClass)); 
MyDict.Add("C", typeof(MyCObjectClass)); 

string typeIwant = "B"; 
var myobject = Activator.CreateInstance(MyDict[typeIwant]); 
+2

Si cela satisfait vraiment l'exigence, pourquoi ajouter l'énorme * * complexité (par rapport à cette solution) d'un cadre distinct? – SimonC

+1

@SimonC: qu'est-ce qui vous fait penser que l'ajout d'un framework comme 'Unity' ajoute une complexité" énorme "? Le code va effectivement réduire, et plus encore, que la liste des classes instanciables se développe. – code4life

+2

Vous devez encore configurer le framework avec le mapping de 'name' pour taper d'une manière ou d'une autre ce qui va se développer exactement de la même manière que le dictionnaire, mais alors vous devez apprendre comment le framework est configuré, ce que l'API est , quels bogues peuvent exister, etc, et tout le monde qui maintient votre code. – SimonC

Questions connexes