Я успешно использовал MEF для получения экспортируемых экземпляров класса. Однако я столкнулся с ситуацией, где я должен перечислить ряд экспортируемых производных классов, не инстанцируя их. Я искал CompositionContainer
документация и это только, кажется, могут к экземплярам эхо-сигнала.
Я знаю, что мог иметь статическое поле Type в каждом производном классе и экспортировать его или сделать мое собственное отражение, но я хотел бы знать, существует ли сборка - способом отметить классы с [Export]
припишите и затем перечислите их System.Type
.
Как сказал Леппи, встроенного способа сделать это нет. Это сделано намеренно. Не обязательно взаимно однозначное сопоставление между экспортом и типами (например, любое количество частей может иметь экспорт свойств типа String). Кроме того, в разных моделях программирования часть могла быть получена из файла конфигурации или из динамического языка программирования, поэтому попытка получить связанный с ней тип CLR может не иметь большого смысла.
В зависимости от объема того, что вы пытаетесь сделать, вы потенциально также можете использовать System.ComponentModel.Composition.ReflectionModel.ReflectionModelServices, которые были введены API для поддержки кэширования каталогов по умолчанию. Предполагая, что вы используете стандартную модель атрибутивного программирования и знаете, что все ваши [Export] находятся на уровне типа (т.е.они не являются участниками), то вы можете вызвать GetPartType (part) для каждой части вашего каталога, чтобы получить тип.
Как указал Дэниел, если вы используете другие модели программирования, это не сработает для вас, но если вы используете только каталоги по умолчанию, которые поставляются с MEF, тогда он должен выполнять свою работу.
Что-то не так с использованием Reflection для этого?
Если нет, это мой ответ :)
Изменить:
Нет встроенного способа получить все типы в сборка с определенным атрибутом.
Обычно вам действительно не нужно выбирать экспорт в зависимости от типа. Вместо этого вы можете найти «правильный» экспорт на основе метаданных.
См. Раздел руководства по программированию MEF на Экспорт и метаданные .