2017-07-20 8 views
1

Je dois appeler n'importe quelle méthode de n'importe quelle classe (dans le même assemblage) et passer les paramètres. Jusqu'ici tout va bien (je crois), mais Invoke me demande un tableau d'objets (que je peux obtenir) mais dans le même ordre que celui prédéfini dans la méthode.C# - Comment définir l'ordre correct des paramètres invoquant avec réflexion?

J'ai fait cette classe pour les paramètres:

public class Parametros { 
    public string type { get; set; } 
    public string name { get; set; } 
    public object value { get; set; } 

} 

et ma méthode pour « invoquer » est la suivante:

public static void Executar(string namespaceClass, string metodo,List<Parametros> parametros) { 
     Type type = Type.GetType(namespaceClass); 
     Object obj = Activator.CreateInstance(type); 
     MethodInfo methodInfo = type.GetMethod(metodo); 
     List<object> myParams = new List<object>(); 
     foreach (Parametros myparam in parametros) { 
      //Get and order the params 
      myParams.Add(myparam.value); 
     } 

     methodInfo.Invoke(obj, myParams.ToArray()); 
    } 

Sans la solution de spécifier l'ordre dans ma classe Parametros, il est un moyen d'accomplir cela, obtenir les noms des paramètres et l'envoyer à la méthode invoke?

Répondre

1

Enfin, je comprends, je vais laisser la réponse à tous ceux qui en ont besoin. Cela fonctionne avec les types statiques et non statiques. Prendre en considération que namespaceClass doit être Namespace.etc.Class

public static void Executar(string namespaceClass, string metodo, List<Parametros> parametros = null) 
    { 
     Type type = Type.GetType(namespaceClass); 
     MethodInfo methodInfo = type.GetMethod(metodo); 
     Object objectToInvoke; 
     if (type.IsAbstract && type.IsSealed) 
     { 
      objectToInvoke = type; 
     } 
     else { 
      objectToInvoke = Activator.CreateInstance(type); 
     } 

     ParameterInfo[] parametersFromMethod = methodInfo.GetParameters(); 



     if (parametros != null || (methodInfo != null && parametersFromMethod != null && parametersFromMethod.Length > 0)) 
     { 
      List<object> myParams = new List<object>(); 
      foreach (ParameterInfo parameterFound in parametersFromMethod) 
      { 
       Parametros parametroEspecificado = parametros.Where(p => p.name == parameterFound.Name).FirstOrDefault(); 
       if (parametroEspecificado != null) 
       { 
        myParams.Add(parametroEspecificado.value); 
       } 
       else 
       { 
        myParams.Add(null); 
       } 

      } 

      methodInfo.Invoke(objectToInvoke, myParams.ToArray()); 

     } 
     else 
     { 
      methodInfo.Invoke(objectToInvoke, null); 
     } 


    }