2017-07-20 80 views
1

我需要從任何類(在同一個程序集中)調用任何方法並傳遞參數。到目前爲止這麼好(我相信),但Invoke問我一個對象數組(我可以得到),但是按照方法中預定義的順序。c# - 如何設置調用反射參數的正確順序?

我做了這個類的參數爲:

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

} 

,我的方法「調用」如下:

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()); 
    } 

沒有的解決方案,我Parametros類指定的順序,有有什麼辦法可以實現這一點,獲取參數的名稱並將其發送到invoke方法?

回答

1

最後我明白了,我會讓任何需要它的人得到答案。它適用於靜態和非靜態類型。考慮到namespaceClass必須爲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); 
     } 


    } 
相關問題