2013-04-04 3 views
0

Supposons que j'ai une chaîne nommée str avec une certaine valeur qui est le nom d'une classe. par exemple string str="MyClass"; Est-ce un moyen d'instancier un objet ou une liste d'objets à l'aide de cette variable?instancier un objet ou une liste d'objets avec des variables

(C'est parce que je ne sais pas depuis le début de quel type d'objets que je devrais créer mais quelque part à l'intérieur du programme, je reçois une liste de chaînes avec le nom des classes)

Certains code idiot factice de ce je veux vraiment est:

List<**str**> myList = new List<str>(); 

ou

**str** object = new **str**(); 

Thanx à l'avance!

+1

Vous ne voulez certainement pas faire ça. Cela peut être fait, mais cela ne devrait pratiquement jamais être le cas. Il y a de fortes chances qu'il existe une meilleure façon d'aborder le véritable problème sous-jacent. – Servy

+1

Avec @Servy. Laissez simplement vos objets implémenter une interface ou hériter d'une classe de base et déclarer la liste comme List . – CodeCaster

Répondre

1

Vous pouvez utiliser la réflexion, supposons que votre classe est dans le même ensemble:

string input = "MyClass"; 

var type = Assembly.GetExecutingAssembly() 
        .GetTypes() 
        .FirstOrDefault(t => t.Name == input); 

MyClass myObject = (MyClass)Activator.CreateInstance(type); 
+0

Merci pour votre réponse.Cependant, dans ce cas (3ème déclaration), vous devez écrire explicitement le nom de la classe et cast avec le nom de la classe (MyClass) comme si vous saviez quelle classe vous devez utiliser.Mais je Je ne connais pas le nom depuis le début. J'ai seulement une chaîne au milieu du programme qui est liée à un nom de classe. –

+0

@Cuong Le: nous pourrions changer la 3ème instruction en: dynamic myObject = Activator.CreateInstance (type); comme type dynamique a été conçu à cet effet. –

+0

Ou il est préférable d'utiliser une classe de base de MyClass dans ce cas. Parce que cela n'a aucun sens d'utiliser la réflexion lorsque nous connaissons le type à l'avance: BaseClass myObject = Activator.CreateInstance (type) en tant que BaseClass; –

0

Vous pouvez baser votre code sur les points suivants, qui construit une instance de MyClass donné son nom:

namespace MyNameSpace { 

    public class MyClass { 
     public MyClass() { 
      // initialise 
     } 

     public static MyClass CreateMyClassFromName() { 
      Type myType = Type.GetType("MyNameSpace.MyClass"); 
      System.Reflection.ConstructorInfo constinfo = myType.GetConstructor(new Type[] { }); 
      MyClass mc = (MyClass)constinfo.Invoke(null); 
      return mc; 
     } 

    } 

} 
Questions connexes