MethodInfo.Invoke参数顺序(MethodInfo.Invoke parameter

2019-07-30 11:11发布

我试图调用使用反射的方法。

事情是这样的:

method.Invoke(instance, propValues.ToArray())

问题是,没有办法保证的参数数组在正确的顺序。 有没有办法具体哪些值的推移它通过名称参数? 还是我真的有做一个定制绑定? 如果是这样,任何人都可以指导我在正确的方向?

Answer 1:

有没有办法具体哪些值的推移它通过名称参数?

那么,你在参数顺序指定它们。 所以,如果你想将特定值映射到特定的名称,你应该取得与参数列表method.GetParameters并将其映射的方式。 例如,如果你有一个Dictionary<string, object>与参数:

var arguments = method.GetParameters()
                      .Select(p => dictionary[p.Name])
                      .ToArray();
method.Invoke(instance, arguments);


Answer 2:

编辑:这个答案集中在参数类型不是参数名称。 如果代码混淆(或具有不同PARAM名称)然后将很难于乔恩斯基特提供了解决方案映射。

无论如何,我已经玩这个有很多....这是最适合我(不知道名字PARAM):

    public object CallMethod(string method, params object[] args)
    {
        object result = null;

        // lines below answers your question, you must determine the types of 
        // your parameters so that the exact method is invoked. That is a must!
        Type[] types = new Type[args.Length];
        for (int i = 0; i < types.Length; i++)
        {
            if (args[i] != null)
                types[i] = args[i].GetType();
        }

        MethodInfo _method = this.GetType().GetMethod(method, types);

        if (_method != null)
        {
            try
            {
                _method.Invoke(this, args);
            }
            catch (Exception ex)
            {
                // instead of throwing exception, you can do some work to return your special return value

                throw ex;
            }
        }

        return result;

    }

所以,你可以调用上面的函数:

    object o = CallMethod("MyMethodName", 10, "hello", 'a');

以上的通话将应该能够调用此方法相匹配的签名:

public int MyMethodName(int a, string b, char c) {
   return 1000;
}

请注意,他上面的例子中的“范围this



文章来源: MethodInfo.Invoke parameter order
标签: c# reflection