我迷失了,觉得我可能会发疯。在下面的代码中,TestGetCountry()工作正常,但TestGetState()会抛出"参数计数不匹配"例外。我迷失了为什么我在一种方法中获得异常,而不是另一种方法。委托使用相同的签名,传递相同的参数类型(string [])。
[TestMethod]
public void TestGetCountry()
{
string expected = Address.GetCountry();
// get the method associated with this Enums.StringGenerator from the dictionary
Delegate action = StringGenerators.GetStringGenerator(Enums.StringGenerators.COUNTRY);
string[] args = new string[] { "" };
string actual = (string)action.DynamicInvoke(args);
Assert.AreEqual(expected, actual, "Country does not match");
}
[TestMethod]
public void TestGetState()
{
string expected = "CA";
Delegate action = StringGenerators.GetStringGenerator(Enums.StringGenerators.STATE);
string[] args = new string[] {"CA", "NY"};
string actual = (string)action.DynamicInvoke(args); // exception thrown here
Assert.AreEqual(expected, actual, "State does not match");
}
StringGenerator委托如下所示:
public delegate string StringGenerator(object container);
GetCountry方法如下所示:
public static string GetCountry(object container)
{
return Address.GetCountry();
}
GetState方法如下所示:
public static string GetState(object container)
{
string[] states = (string[])container;
int index = SeedGovernor.GetRandomInt(states.Length);
return states[index];
}
答案 0 :(得分:8)
string[]
可转换为object
,因此此行:
string actual = (string) action.DynamicInvoke(args);
...正在使用两个参数调用委托。你想要这个:
string actual = (string) action.DynamicInvoke((object) args);
...以便它扩展为创建单个元素object[]
,其唯一元素是对字符串数组的引用。