Метод с аргументом Object не будет принимать ничего, кроме Object - PullRequest
1 голос
/ 06 октября 2009

У нас есть функция VB.net со следующей сигнатурой в классе InitializerFactory:

Public Shared Function Create(ByRef ui As Object) As IModeInitializer

Я пытаюсь проверить эту функцию, передав макет пользовательского интерфейса (используя Rhino Mocks):

MainForm ui = mocks.StrictMock<MainForm>();
IModeInitializer item = InitializerFactory.Create(ref ui);

При попытке передать пользовательский интерфейс в качестве параметра я получаю следующие ошибки:

  • Лучший перегруженный метод соответствует 'InitializerFactory.Create (ref object)' имеет несколько недопустимых аргументов
  • Аргумент '1': невозможно преобразовать из 'ref MainForm' в 'ref object'

В идеале, решением было бы извлечь интерфейс в пользовательском интерфейсе (или его классе, MainForm), но это невозможно сделать любым способом - это чрезвычайно раздутый класс.

Я также не могу объявить пользовательский интерфейс как Object, иначе я не могу высмеивать методы внутри него, поскольку методы не принадлежат типу Object.

У меня вопрос - что я делаю не так?

1 Ответ

3 голосов
/ 06 октября 2009

Это только из-за синтаксиса параметра ref. Проблема в том, что функция должна иметь возможность устанавливать ЛЮБОЙ тип объекта, так как это параметр by ref. Вы не можете просто передать ему ссылку на MainForm, что вы пытаетесь.

К сожалению, это довольно сложный API для работы.

Вы можете справиться с этим, сначала назначив свой экземпляр объекту:

MainForm ui = mocks.StrictMock<MainForm>();
object uiObj = ui;
IModeInitializer item = InitializerFactory.Create(ref uiObj);
if (uiObj != ui) { 
    // Handle the case where the reference changed!
    ui = uiObj as MainForm; // May be null, if it's no longer a "MainForm"
}

Если вы хотите полностью понять это, вы можете прочитать о Ковариация и Контравариантность .

...