DynamicInvoke引发参数计数不匹配

时间:2017-07-17 16:07:18

标签: c#

我迷失了,觉得我可能会发疯。在下面的代码中,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];
    }

1 个答案:

答案 0 :(得分:8)

string[]可转换为object,因此此行:

string actual = (string) action.DynamicInvoke(args);

...正在使用两个参数调用委托。你想要这个:

string actual = (string) action.DynamicInvoke((object) args);

...以便它扩展为创建单个元素object[],其唯一元素是对字符串数组的引用。