Частный объект Invoke Array сложного типа - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь протестировать приватные следующие приватные методы

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]);
            }
    }

Второй вызов Invoke завершается с ошибкой System.MissingMethodException.

Кажется, не удается найти метод при использовании сложного типа в качестве параметра массива

1 Ответ

0 голосов
/ 27 июня 2018

Если я правильно понимаю, это странная вещь, связанная с тем, как clr работает с массивами параметров. Это довольно глубоко, и я видел, как Эрик Липперт говорил об этом несколько раз.

Метод с массивом параметров может быть вызван в «нормальной» или «расширенной» форме. Нормальная форма такая, как будто не было "params". Расширенная форма принимает параметры и объединяет их в массив, который генерируется автоматически. Если обе формы применимы, то нормальная форма побеждает расширенную форму.

Длинное и короткое из этого: смешивание объекта params [] с массивом Аргументы - это рецепт путаницы. Постарайся избежать этого. Если вы находитесь в ситуация, когда вы передаете массивы в метод params 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 [] странное поведение

Почему параметры ведут себя так?

Есть ли способ отвлечь myFunc (1, 2, 3) от myFunc (new int [] {1, 2, 3})?

...