反射调用方法-参数异常

本文关键字:参数 异常 方法 调用 反射 | 更新日期: 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方法的第一个参数。