Скрытие метода от класса VB в производном классе C#

Я пишу набор модульных тестов для большого, сложного класса, называемого ImageEditor, из фрагмента устаревшего кода, в котором обработка изображений и функциональность графического интерфейса пользователя строго не разделены. Один из методов в классе, BaseImageChanged, кажется, полностью связан с тем, как изображения отображаются, и должен быть отключен в моих модульных тестах, чтобы избежать ненужной сложности. Тестовый проект на C#, а оригинальный код на VB; Моя идея состояла в том, чтобы создать Decorator для класса в C#, а затем спрятать метод за пустым, который ничего не делает. Однако, когда я пытаюсь запустить модульный тест, код VB продолжает ссылаться на старый метод BaseImageChanged, как будто замены не существует. Вот что я делаю:

(VB класс)

Public Class ImageEditor
  ...
  Public Sub BaseImageChanged()
  ...
  End Sub
  ...
End Class

(Класс C#)

class ImageEditorTestingClass : ImageEditor_Accessor
{
   public new void BaseImageChanged() {}
}

Есть ли способ добиться такой совместимости или мне придется искать другой путь?

РЕДАКТИРОВАТЬ: ошибка компилятора оказалась проблема с отражением. Кроме того, переопределение метода не работало до тех пор, пока базовый класс являлся средством доступа к ImageEditor вместо исходного класса ImageEditor (ошибки компилятора нет, но поведение базового метода не было переопределено).

3 ответа

Решение

У вас есть доступ к коду VB? если это так, отметьте его как виртуальный (синтаксис C#); Затем в коде C# переопределите его с пустым телом, чтобы id ничего не делал.

Вы не должны (почти) никогда не использовать 'new' для переопределения методов или свойств. Если некоторый код предполагает, что это базовый класс, даже если вы передадите производный класс, будут вызваны базовые методы.

Для лучшего понимания прочитайте о позднем связывании и раннем связывании в.NET

Раннее и позднее связывание

Кажется, @estanford принял этот ответ из-за моего комментария ниже

"Где вы вызываете BaseImageChanged, попробуйте использовать отражение"

Я вообще не знаю VB, но это больше похоже на случай virtual метод с override чем метод сокрытия. Код VB, вероятно, где-то вызывает this.BaseImageChanged(), что не вызовет ваш новый метод... верно?

Похоже, что здесь происходит, что

  1. У вас есть библиотека, написанная на VB.Net
  2. Ваши модульные тесты написаны на C# и используют MSTest
  3. Вы пытаетесь получить от созданного средства доступа вместо исходного класса

В этом случае единственный вариант, который у вас есть, это использовать new, Сгенерированный класс средства доступа не будет добавлять виртуальные методы и, следовательно, если вы хотите предоставить альтернативный метод с тем же именем new это единственный способ сделать это.

Другие вопросы по тегам