反射调用方法 - 参数异常
我对我的命令有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[]
类型单元素传递阵列到Invoke方法:
method.Invoke(commands[command], new object[] {args});
Invoke方法接受两个参数,即具有要调用的方法的实例和表示参数的数组。在你的情况下,你的第一个参数是一个数组。因此,发送给方法的是您的字符串数组的每个成员作为单独的参数,而不是作为第一个参数的数组。你想要的是:
new object[] {args}
这会使你args
的第一个参数OnExecute
方法。
右半边。给出的代码中的第一个参数是调用该方法的类的实例,而不是MethodInfo –
@roger willcocks你是对的。我修好了它。感谢您的更正 – dman2306
您必须将参数传递为object[]
类型。
所以,必须传递参数是这样的:method.Invoke(commands[command], new object[] {args});
不喜欢这样的:method.Invoke(commands[command], args);
MethodBase.Invoke
方法需要一个参数作为对象阵列(对象[])所以必须使对象数组并将所有参数存储到数组中。
尝试像新对象[] {args}作为调用的第二个参数。它期望一个代表参数的数组。你想要第一个参数是一个数组。 – dman2306
例外说什么? – MarcinJuraszek
@ dman2306它的工作!和23.06是我和我女朋友的约会:D –