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