Bonjour à tous,
Je vois qu'il n'y a pas eu de réponses claires sur la question.
Pour créer un objet à l'aide la reflection, c'est très simple, tu récupères l'objet assembly, puis tu invoques "CreateInstance". A l'aide du nom de la classe et du tableau de paramètres passés (pour les arguments du constructeur), tu reçois un objet instancié de la classe voulue.
Voici ci-dessous 3 méthodes qui permettent d'effectuer ce traitement (la troisième est celle qui appelle "CreateInstance" sur l'objet Assembly):
1) Cette méthode récupère l'objet assembly de celle qui est en cours d'exécution. Typiquement si cette méthode se trouve dans une libraire externe à ton programme principal, l'assembly appelante (CallingAssembly) est la libraire externe, et donc cette méthode va instancier un objet d'une classe se trouvant dans la librairie externe. Elle appelle ensuite la méthode "CreateObject", troisième méthode ci-dessous.
public static object CreateObjectWithExecutingAssembly(string sClassName, object[] args)
{
System.Reflection.Assembly oAssembly = System.Reflection.Assembly.GetExecutingAssembly();
return CreateObject(sClassName, oAssembly, args);
}
2) Cette méthode récupère l'objet assembly de celle qui appelle cette methode. Typiquement si cette méthode se trouve dans une libraire externe à ton programme principal, l'assembly appelante (CallingAssembly) est
le programme principal, et donc cette méthode va instancier un objet d'une classe se trouvant dans ton programme principal (Partant du principe que ta librairie externe n'as aucune référence sur le programme principal). Elle appelle ensuite la méthode "CreateObject", troisième méthode ci-dessous.
public static object CreateObjectWithCallingAssembly(string sClassName, object[] args )
{
System.Reflection.Assembly oAssembly = System.Reflection.Assembly.GetCallingAssembly();
return CreateObject(sClassName, oAssembly, args);
}
3) Cette méthode va instancier un nouvel objet à l'aide de la String "sClassName" passée en paramètre. Les arguments correspondent à la signature du constructeur de la classe, à savoir les paramètres qu'il faut passer au constructeur.
public static object CreateObject(string sClassName, System.Reflection.Assembly oAssembly, object[] args )
{
return oAssembly.CreateInstance(sClassName, true, System.Reflection.BindingFlags.CreateInstance, null, args, null, null);
}
Ensuite, que faire avec cette objet ? Si on sait de quelle nature il doit être, il suffit de le caster dans l'objet voulu:
MaClasse oMaClasse = (MaClasse) objetInstancié;
Par contre si on ne connaît pas la nature de la classe, et qu'on a les méthode que l'on désire appeller sur cet objet sous forme de String (pour une application totalement dynamique, dont les indications sont écrites dans un fichier xml par exemple) il va falloir opérer comme ceci:
public static object GetMethodObjectResult(object oUnderlyingObject, string sMethod, object[] oParams)
{
object oResult = null;
System.Reflection.MethodInfo oMethodInfo = null;
try
{
if (oUnderlyingObject != null)
{
System.Type dynClassType = oUnderlyingObject.GetType();
if (sMethod != null && sMethod != "")
{
oMethodInfo = dynClassType.GetMethod(sMethod);
if (oMethodInfo != null)
{
oResult = oMethodInfo.Invoke(oUnderlyingObject, oParams);
}
}
}
}
catch (Exception e)
{
// Exception à traiter au cas par cas
}
return oResult;
}
Il ne reste plus qu'à traiter la réponse de la méthode, qui est sous forme d'un objet à caster selon le type.
Voilà j'espère avoir été plus ou moins clair, et j'espère que cela a pu éclairer certaines personnes.
Bonne fin de journée,