我有一个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 []'类型。
我有点失落,因为我真的不知道出了什么问题。 我会提供任何帮助!
答案 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:关于设计我不建议回收列表对象,而是创建一个带有参数的专用对象。