反射调用方法 - 参数异常

反射调用方法 - 参数异常

问题描述:

我对我的命令有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

尝试像新对象[] {args}作为调用的第二个参数。它期望一个代表参数的数组。你想要第一个参数是一个数组。 – dman2306

+0

例外说什么? – MarcinJuraszek

+0

@ dman2306它的工作!和23.06是我和我女朋友的约会:D –

因为你的方法接受一个参数(OnExecute(string[] args))即是一个字符串数组,你需要string[]类型单元素传递阵列到Invoke方法:

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

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

new object[] {args}

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

+0

右半边。给出的代码中的第一个参数是调用该方法的类的实例,而不是MethodInfo –

+0

@roger willcocks你是对的。我修好了它。感谢您的更正 – dman2306

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

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

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

MethodBase.Invoke方法需要一个参数作为对象阵列(对象[])所以必须使对象数组并将所有参数存储到数组中。