Declaration dynamique d'une classe et d'une méthode de celle-ci

Contenu du snippet

Pour construire des applications qui s'adaptent aux évolutions des assemblages, rien de tel que le dynamique.
Cela permet par exemple d'appeller une méthode commune à plusieurs classes en donnant par saisie d'une chaine le nom de la classe.

Différentes versions sont décrites ci-dessous. Ne pas oublier d'ajouter
le namespace System.Reflection : using System.Reflection;

Les objets utilisés sont à découvrir plus précisément par vous-même, ils permettent de parcourir notamment tout le contenu d'un assemblage...

Source / Exemple :


// Version longue pour un assemblage qui est externe mais local (.dll)
// aucune référence et using n'est nécessaire. Ne marche pas pour
// un assemblage dans le gac
Assembly v_Assembly=Assembly.Load("Namespace1");
Module v_Module=v_Assembly.GetModule("Namespace1.dll");
Type v_Type=v_Module.GetType("Namespace1." + ClasseConcernee,true,false);
MethodInfo v_metInfo=v_Type.GetMethod("Method1");
Object[] v_tabParameters=new Object[] {Liste des paramètres};
v_metInfo.Invoke(v_Type,v_tabParameters);

// Version courte pour un assemblage qui est externe mais local (.dll)
// aucune référence et using n'est nécessaire. Ne marche pas pour
// un assemblage dans le gac
Type v_Type=Assembly.Load("Namespace1").GetModule("Namespace1.dll").GetType("Namespace1." + ClasseConcernee,true,false);
v_Type.GetMethod("Method1").Invoke(v_Type,new Object[] {Liste des paramètres});

// Version pour un assemblage externe mais référéncé et
// avec un using dans la classe en question.
// L'avantage de celui-ci est qu'il prend en compte un assemblage local
// ou dans le gac.
Assembly[] v_CurrentAssemblies=AppDomain.CurrentDomain.GetAssemblies();
// Recherche de l'assemblage que l'ont veut utiliser
// parmi les assemblages utilisés actuellement
foreach (Assembly v_Assembly in v_CurrentAssemblies)
 {
 if (  v_Assembly.FullName.StartsWith("Namespace1") )
  {
   // L'assemblage a été trouvé, execution de notre méthode
   Type v_Type=v_Assembly.GetType("Namespace1." + ClasseConcernee,true,false);
   v_Type.GetMethod("Import").Invoke(v_Type,new Object[] {Liste des paramètres});
   break;
   }
  }

// Pour l'assemblage courant
// et même nom de namespace
Type v_Type=Type.GetType(ClasseConcernee,true,false);
v_Type.GetMethod("Method1").Invoke(v_Type,new Object[] {Liste des paramètres});

Conclusion :


Il existe énormément de manière pour lancer dynamiquement
une classe, seul une petite partie est montrée ici...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.