1

我正在尝试使用以下私有方法测试私有

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。

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

4

1 回答 1

2

如果我理解正确,这是与 clr 如何计算参数数组有关的怪癖。这非常深入,我已经看到 Eric Lippert 多次谈论它。

可以以“正常”或“扩展”形式调用具有参数数组的方法。正常形式好像没有“参数”。扩展形式采用参数并将它们捆绑到自动生成的数组中。如果两种形式都适用,则正常形式胜过扩展形式。

总而言之:将 params object[] 与数组参数混合会造成混淆。尽量避免它。如果您处于将数组传递给 params object[] 方法的情况,请以其正常形式调用它。创建一个新的 object[] { ... } 并自己将参数放入数组中。

所以要解决这个问题

bool response2 = (bool)obj.Invoke("PVTMethod2", (object)new RandomClass[0]);

或者

bool response2 = (bool)obj.Invoke("PVTMethod2", new object {new RandomClass[0]});

我不会假装知道 CLR 的内部,但是如果您有兴趣,可以查看这些问题

带有 params object[] 构造函数的属性给出了不一致的编译器错误

C# params object[] 奇怪的行为

为什么 params 会有这样的行为?

有没有办法区分 myFunc(1, 2, 3) 和 myFunc(new int[] { 1, 2, 3 })?

于 2018-06-27T12:07:32.443 回答