C# 反射调用方法-参数异常

C# 反射调用方法-参数异常,c#,C#,我有一本字典,可以输入我的命令。所有命令都有一个从Cmd类扩展而来的类。现在我尝试调用OnExecute方法,但得到了ArgumentException 这是我调用该方法的函数: public void Execute(string command, string[] args) { try { Type type = commands[command].GetType(); MethodInfo method = type

我有一本字典,可以输入我的命令。所有命令都有一个从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());
        }
    }
}

由于您的方法接受一个参数(
OnExecute(string[]args)
),即字符串数组,因此需要将带有类型为
string[]
的单个元素的数组传递给方法:


由于您的方法接受一个参数(
OnExecute(string[]args)
),即字符串数组,因此需要将带有类型为
string[]
的单个元素的数组传递给方法:


Invoke方法接受两个参数,一个是具有要调用的方法的实例,另一个是表示参数的数组。在本例中,第一个参数是数组。因此,发送给方法的是字符串数组的每个成员作为单个参数,而不是数组作为第一个参数。你想要的是:

newobject[]{args}


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

Invoke方法采用两个参数,一个实例具有要调用的方法,另一个数组表示参数。在本例中,第一个参数是数组。因此,发送给方法的是字符串数组的每个成员作为单个参数,而不是数组作为第一个参数。你想要的是:

newobject[]{args}


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

您必须将参数作为
对象[]
类型传递

所以,必须像这样传递参数:
method.Invoke(命令[command],新对象[]{args})

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


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

您必须将参数作为
对象[]
类型传递

所以,必须像这样传递参数:
method.Invoke(命令[command],新对象[]{args})

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


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

尝试使用类似new object[]{args}的方法作为要调用的第二个参数。它需要一个表示参数的数组。您希望第一个参数是数组。异常说明了什么?@dman2306它的工作!23.06是我和女朋友的约会:D@CanSpielt很高兴我能帮忙。我把它作为一个评论,因为我在我的手机上。我只是把它作为一个答案,所以希望它能帮助别人也!尝试使用newobject[]{args}作为第二个要调用的参数。它需要一个表示参数的数组。您希望第一个参数是数组。异常说明了什么?@dman2306它的工作!23.06是我和女朋友的约会:D@CanSpielt很高兴我能帮忙。我把它作为一个评论,因为我在我的手机上。我只是把它作为一个答案,所以希望它能帮助别人也!对了一半。给定代码中的第一个参数是要在其上调用方法的类的实例,而不是MethodInfo@roger威尔科克斯:你说得对。我修好了。谢谢你的纠正,对了一半。给定代码中的第一个参数是要在其上调用方法的类的实例,而不是MethodInfo@roger威尔科克斯:你说得对。我修好了。谢谢你的更正
 method.Invoke(commands[command], new object[] {args});