web-dev-qa-db-fra.com

Créer une instance d'objet d'une classe ayant son nom dans une variable chaîne

Je ne sais pas si la chose que je demande est disponible ou non, mais je veux simplement savoir si elle existe et comment cela fonctionne. Voici donc ma question:

J'ai 2 ou 3 classes de modèles personnalisés. Par exemple, Client, Employé et produit. Maintenant, j'ai le nom de la classe dans une chaîne. et basé sur le nom de la classe venant dans une chaîne, je dois créer son objet et retourner à une vue. Comment pourrais-je y parvenir?

Je connais une option de l'instruction IF ELSE mais je veux essayer un meilleur moyen " Dynamique " ...

19
Dhwani

Avoir le nom de la classe dans chaîne ne suffit pas pour pouvoir créer son instance . En fait, vous aurez besoin d'un espace de noms complet, y compris le nom de la classe, pour créer un objet.

En supposant que vous ayez les éléments suivants: 

string className = "MyClass";
string namespaceName = "MyNamespace.MyInternalNamespace";

Ensuite, vous pouvez créer une instance de cette classe, l'objet de la classe MyNamespace.MyInternalNamespace.MyClass en utilisant l'une des techniques suivantes:

var myObj = Activator.CreateInstance(namespaceName, className);

ou ca:

var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className));

J'espère que cela aide, s'il vous plaît faites le moi savoir si pas.

41
Display Name
    string frmName = "frmCustomer";
    //WorldCarUI. is the namespace of the form
    Type CAType = Type.GetType("WorldCarUI." + frmName );
    var myObj = Activator.CreateInstance(CAType);
    Form nextForm2 = (Form)myObj;
    nextForm2.Show();

cela fonctionne ..

Cordialement Avi

9
Avinash

le moyen le plus simple consiste à utiliser Activator. Passez le nom de la classe à GetType et créez une nouvelle instance.

ClassInstance s1 = (ClassInstance)Activator.CreateInstance(Type.GetType("App.ClassInstance"));

public class ClassInstance
{
    public string StringData { get; set; }
}

Cordialement, Nik

2
Nik

La classe Activator effectue ce travail en .net et cette technique est très utile pour les scénarios de type injection de dépendance.

string NameSpace = "ProjectName.YourNameSpace";
string ProbeClass = "CLassName";

ObjectHandle ProberHandle = Activator.CreateInstance(NameSpace, ProbeClass) as ObjectHandle;
ClassName Prober = ProberHandle.Unwrap() as ClassName;

Assurez-vous de dérouler avant le transtypage, sinon cela produira une erreur de conversion.

0