复杂类型的私有对象调用数组

时间:2018-06-27 11:36:41

标签: c# unit-testing privateobject.invoke

我正在尝试通过以下私有方法测试私有

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。

使用复杂类型作为数组参数时似乎找不到方法

1 个答案:

答案 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 })?