Можно ли определить, реализуют ли два объекта общий интерфейс, который не указан во время компиляции? - PullRequest
0 голосов
/ 07 июня 2018

Учитывая Object1 и Object2, существуют ли какие-либо методы для определения, реализуют ли они оба общий интерфейс?Нет проблем, если интерфейс известен во время компиляции (используйте typeof ... is [known interface]), но что если интерфейс не указан во время компиляции?

Конкретный вариант использования - реализация строго типизированного объекта коллекции.Я только хочу добавить Object2, если он имеет общий интерфейс как Object1.Typename не работает, так как он возвращает базовый тип объекта, и у меня может быть два отдельных объекта, каждый из которых реализует ISomeInterface, но в разных базовых классах.

Пример, который не совсем работает, можно найти здесь (поскольку оно опирается на typename, но не позволяет сравнивать интерфейсы)

В частности, расширение функции IsTypeSafe найдено здесь в CodeReview , но адаптировано так, что если объект поддерживает интерфейсобщий для всех ранее добавленных элементов, его можно добавить в список.

Специальный вопрос: есть ли способ определить, реализуют ли два объекта общий интерфейс, который не определен во время компиляции

1 Ответ

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

Я действительно запутался с вашей формулировкой "не указано во время компиляции", но суть вашего вопроса здесь:

, если объект поддерживает интерфейс, общий для всех ранее добавленных элементов, его можно добавить в список.

Другими словами, вы спрашиваете, есть ли способ сделать это в VBA (псевдо-миш-маш VBA / C #):

isOk = item.Type.Interfaces.Any(i => other.Type.Interfaces.Contains(i))

Для того, чтобы иметь возможность проверять реализованные интерфейсы объектной переменной, вы должны иметь возможность проверять ее тип во время выполнения.Эта способность называется «отражением» ... и VBA не может этого сделать.

Rubberduck (отказ от ответственности: я управляю этим проектом надстройки OSS VBIDE) имеет COM-интерфейс API, который можетв конечном счете, он должен поддерживать именно это (он с открытым исходным кодом, реализуем его - мы очень рады принимать запросы по запросу!), но для того, чтобы поработать с его магией, ему необходимо буквально проанализировать и разрешить весь проект и все его ссылки, которыеозначает, что использование отражения для того, для чего вы хотите его использовать, будет массовым падением производительности.

"Типобезопасный" класс List в VBA в основном курит и отражает,Извините!

...