我需要从任何类(在同一个程序集中)调用任何方法并传递参数。到目前为止一切都那么好(我相信),但是Invoke向我询问了一个对象数组(我可以得到),但顺序与方法中预定义的顺序相同。
我为参数创建了这个类:
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方法?
答案 0 :(得分: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);
}
}