反射调用方法 - 参数异常

时间:2015-07-20 01:25:24

标签: c#

我的命令Dictionary<string, object>。所有命令都有一个从Cmd类扩展的类。现在我尝试调用OnExecute方法,但我得到ArgumentException

这是我调用方法的函数:

public void Execute(string command, string[] args)
    {
        try {
            Type type = commands[command].GetType();
            MethodInfo method = type.GetMethod("OnExecute");
            method.Invoke(commands[command], args);
        }
        catch (ArgumentException ex)
        {
            Program.Exception(ex);
        } catch (TargetException ex)
        {
            Program.Exception(ex);
        }
    }

这是我的Cmd课程

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Valda.Valda.Command
{
    public class Cmd
    {

        public Cmd()
        {

        }

        public void OnExecute(string[] args)
        {
            Program.WriteLine(args.ToString());
        }
    }
}

3 个答案:

答案 0 :(得分:2)

由于您的方法采用一个参数(OnExecute(string[] args)),这是一个字符串数组,您需要将类型为string[]的单个元素的数组传递给Invoke方法:

 method.Invoke(commands[command], new object[] {args});

答案 1 :(得分:2)

您必须将参数传递为object[]类型。

所以,你必须传递这样的参数:
method.Invoke(commands[command], new object[] {args});

不是这样的:
method.Invoke(commands[command], args);

MethodBase.Invoke方法需要一个参数作为对象数组(object []),因此您必须创建一个对象数组并将所有参数存储到数组中。

答案 2 :(得分:1)

Invoke方法有两个参数,即具有要调用的方法的实例和表示参数的数组。在您的情况下,您的第一个参数是一个数组。因此,您发送给方法的是将字符串数组的每个成员作为单个参数而不是作为第一个参数的数组。你想要的是:

new object[] {args}

这会使args成为OnExecute方法的第一个参数。