c# - 如何设置用反射调用的参数的正确顺序?

时间:2017-07-20 23:48:34

标签: c# .net reflection invoke delegation

我需要从任何类(在同一个程序集中)调用任何方法并传递参数。到目前为止一切都那么好(我相信),但是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方法?

1 个答案:

答案 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);
        }


    }