Outils pour utilisateurs

Outils du site


lang:csharp:reflexion

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