在Method.Invoke()

时间:2016-04-16 23:29:53

标签: c# arrays string list

我有一个Dictionary<string, Delegate> commands,我的委托取两个字符串,一个字符串[]作为参数。

我正在控制台应用程序中输入命令:

:adduser username email@email.com Firstname Middlename Lastname

其中所有内容都转换为字符串数组(大小为6)。然后我做

list[3] = string.Join(" ", input, 3, 3);
list.RemoveRange(4, list.Count - 4);

将Firstname,Middlename和Lastname转换为单个字符串,以便我的数组如下所示:

input[0]:adduser

input[1]:username

input[2]:email@email.com

input[3]:Firstname Middlename Lastname

然后我尝试调用commands[input[0]].Method.Invoke(this, list.Skip(1).ToArray<object>());,但它会导致带有消息的ArgumentException

  

'System.String'类型的对象无法转换为'System.String []'类型。

我有点失落,因为我真的不知道出了什么问题。 我会提供任何帮助!

3 个答案:

答案 0 :(得分:1)

Method.Invoke在实例后获取一系列参数。当您必须将数组作为单个参数传递时,需要将其包装在object[]中。否则,它将被解释为委托的一组参数:

commands[input[0]].Method.Invoke(this, new object[] {list.Skip(1).ToArray()});

答案 1 :(得分:1)

你可能意味着

commands[input[0]].Method.Invoke(this, new object[] { list[0], list[1], list.Skip(2).ToArray()});

这应该与您的委托签名相匹配,这些签名需要3个参数。您的错误消息表明您的列表作为第一个参数传递。原因是你必须将其他参数作为对象数组传递,其中第一项是arg1,第二项是arg2,....

答案 2 :(得分:1)

您的问题出在BOOST_TEST_MODULE。如果您的签名实际上是list[3] = string.Join(" ", input, 3, 3);,则无法使用3个字符串调用它。

我的建议:

(string user, string mail, string[] names)

PS:关于设计我不建议回收列表对象,而是创建一个带有参数的专用对象。