我正在尝试通过以下私有方法测试私有
public class Test
{
private bool PVTMethod1(Guid[] Parameter1)
{
return true;
}
private bool PVTMethod2(RandomClass[] Parameter2)
{
return true;
}
}
public class RandomClass
{
public int Test { get; set; }
}
使用以下测试方法
[TestClass]
public TestClass1
{
[TestMethod]
public void SomUnitTest()
{
Test _helper = new Test();
PrivateObject obj = new PrivateObject(_helper);
bool response1 = (bool)obj.Invoke("PVTMethod1", new Guid[0]);
bool response2 = (bool)obj.Invoke("PVTMethod2", new RandomClass[0]);
}
}
第二次调用失败,并出现System.MissingMethodException。
使用复杂类型作为数组参数时似乎找不到方法
答案 0 :(得分:2)
如果我正确理解这一点,这与clr如何计算参数数组有关。这已经很深入了,我见过埃里克·利珀特(Eric Lippert)谈论过几次。
带有params数组的方法可以“正常”或“扩展”形式调用。正常形式好像没有“参数”。扩展形式采用参数并将它们捆绑成一个自动生成的数组。如果两种形式都适用,则普通形式胜过扩展形式。
它的长短是:将params object []与数组混合 论点是造成混乱的秘诀。尽量避免它。如果你在 您将数组传递给params object []方法的情况, 称其为正常形式。制作一个新对象[] {...},然后将 自己将参数放入数组。
所以要解决这个问题
bool response2 = (bool)obj.Invoke("PVTMethod2", (object)new RandomClass[0]);
或
bool response2 = (bool)obj.Invoke("PVTMethod2", new object {new RandomClass[0]});
我不会假装了解CLR的内部内容,但是如果您有兴趣,可以查看这些问题
Attribute with params object[] constructor gives inconsistent compiler errors
C# params object[] strange behavior
Why does params behave like this?
Is there a way to distingish myFunc(1, 2, 3) from myFunc(new int[] { 1, 2, 3 })?