反射调用方法-参数异常
本文关键字:参数 异常 方法 调用 反射 | 更新日期: 2023-09-27 18:03:42
我有一个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());
}
}
}
由于您的方法接受一个参数(OnExecute(string[] args)
),这是字符串数组,您需要传递具有string[]
类型的单个元素的数组来调用方法:
method.Invoke(commands[command], new object[] {args});
您必须将参数传递为object[]
类型。
所以,你必须像这样传递参数:method.Invoke(commands[command], new object[] {args});
not like this:method.Invoke(commands[command], args);
MethodBase.Invoke
方法需要一个参数作为对象数组(object[]),所以你必须创建一个对象数组,并将所有的参数存储在数组中。
Invoke方法有两个参数,一个是包含要调用的方法的Instance,另一个是表示这些参数的数组。在本例中,第一个参数是一个数组。因此,您发送给该方法的是作为单独参数的字符串数组的每个成员,而不是作为第一个参数的数组。你想要的是:
new object[] {args}
这将使args
成为OnExecute
方法的第一个参数。