C# Используйте класс, который реализует интерфейс без добавления ссылки на сборку, которая определяет интерфейс
У меня есть 3 сборки, написанные на C#, а именно A.exe, B.dll, C.dll
- C.dll определяет публичный интерфейс IfaceC.
- A.exe определяет открытый класс ClassA: IfaceC
- B.dll использует ClassA, но явно не использует IfaceC
Мой вопрос: можно ли скомпилировать B без ссылки на C.dll? Я не использую его и хочу запретить разработчику использовать его (то есть случайно ввести "IfaceC" в коде B). Однако A.exe все еще нуждается в этом.
РЕДАКТИРОВАТЬ
Учитывая мои архивы, A может ссылаться на C, но не на B, C не может ссылаться ни на A, ни на B, B не может ссылаться на A, но не (если возможно) C
2 ответа
Нет. У вас должна быть ссылка на любые сборки, содержащие базовые типы или интерфейсы, реализованные любыми используемыми вами типами.
Единственный другой способ уклониться от вашего вопроса и включает в себя Duck Typing
,
C#'s dynamic
ключевое слово type очень удобно в этом отношении. Недостатком является отсутствие статической проверки типов во время компиляции.
По сути, с помощью динамического вы можете передать любой объект (неизвестный) типа, так же, как вы передаете object
экземпляров. Компилятор позволяет вам использовать объект, вызывая методы / свойства и еще много чего, как если бы тип был известен.
Будет выдан код, который ищет соответствующие свойства во время выполнения. Это означает, что во время выполнения будут использоваться метаданные (и общая сборка все еще загружается). Чистая выгода только в том, что на "третью" сборку не ссылаются, и она не должна присутствовать во время компиляции или загрузки программы.