lang:csharp:reflexion
Table des matières
Exemple
// On récupère l'assembly d'un type particulier. // C'est mieux que Assembly.GetExecutingAssembly() Assembly assembly = type.Assembly; Type typeUi = assembly.GetType("TypeAChercher"); if (typeUi == null) { return false; } // On cherche la méthode "ShowDialogStatic" qui est statique, non publique // (internal, protected, private) et qui peut être invoquée (pas constructeur). MethodInfo afficheEditeur = typeUi.GetMethod("ShowDialogStatic", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod); if (afficheEditeur == null) { return false; } // On récupère les paramètres. ParameterInfo[] parametres = afficheEditeur.GetParameters(); object[] argumentsShowDialogStatic = new object[parametres.Length]; for (int i = 0; i < parametres.Length; i++) { // Si c'est un paramètre générique, on récupère la liste des arguments génériques. Type[] typesGeneric = parametres[i].ParameterType.GetGenericArguments(); foreach (Type typeGeneric in typesGeneric) { // On cherche la méthode "ToutesLesActions" dans la classe "PclBatch". MethodInfo method = typeof(PclBatch).GetMethod("ToutesLesActions", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod); // On dit que c'est une méthode générique avec ses arguments génériques. MethodInfo generic = method.MakeGenericMethod(typeGeneric); // On invoque la méthode et on récupère le résultat. argumentsShowDialogStatic[i] = generic.Invoke(batch, BindingFlags.Default, null, new object[] { action.Id }, CultureInfo.InvariantCulture); } } // On invoque la méthode et on récupère le résultat. ActionPocoInterface nouvelle_action = (ActionPocoInterface)afficheEditeur.Invoke(null, argumentsShowDialogStatic);
CultureInfo.InvariantCulture
Avec les valeurs par défaut, Invoke
s'appelle :
generic.Invoke(batch /*objet, null si statique*/, BindingFlags.Default, null, /*liste des arguments*/new object[] { action.Id }, CultureInfo.InvariantCulture);
BindingFlags
Pour trouver une méthode, il faut impérativement :
BindingFlags.Public
: si la méthode est publique,BindingFlags.NonPublic
: si la méthode n'est pas publique (internal
,protected
,private
),BindingFlags.Instance
: si la méthode n'est pas statique,BindingFlags.Static
: si la méthode est statique.
lang/csharp/reflexion.txt · Dernière modification : 2019/03/05 16:50 de root