Я создаю основанное на плагине MEF WPF-приложение и столкнулся с проблемой с GetExports, возможно, это просто мое невежество, но я нахожу странное поведение. У меня есть несколько экспортированных частей, все они получены из 2 разных интерфейсов (назовем их A и B), но все они помечены одним и тем же атрибутом метаданных X. Поэтому у меня есть код вроде:
[Экспорт (TypeOf (А))]
[TheXAttributeHere ...]
открытый класс SomePart1: A {...}
для каждой части и то же самое для классов, реализующих B:
[Экспорт (TypeOf (В))]
[TheXAttributeHere ...]
открытый класс SomePart2: B {...}
Теперь, когда я пытаюсь получить все части, реализующие A и , декорированные атрибутом X с некоторыми значениями, MEF возвращает не только части, реализующие A, но ТАКЖЕ части, реализующие B. Поэтому, когда я ожидаю иметь дело с A-объектами, я получаю B, откуда исключение приведения.
В реальном мире интерфейсы называются IItemPartEditorViewModel и IItemPartEditorView, а их общий атрибут называется ItemPartEditorAttribute и предоставляет строковое свойство PartType, для которого я выполняю некоторую фильтрацию. Таким образом, мой код для получения деталей похож на пример ::1013*
<code>var p = (from l in container.GetExports<IItemPartEditorViewModel, IItemPartEditorMetadata>()
where l.Metadata.PartType == sPartType
select l).FirstOrDefault();
При поиске IItemPartEditorViewModel, чей PartType равен некоторому значению, я получаю IItemPartEditorView вместо реализующего объекта IItemPartEditorViewModel. Если вместо этого я закомментирую атрибут в объекте IItemPartEditorView, я правильно получу реализующий объект IItemPartEditorViewModel.
Обновление был использован предложенный "шаблонный" метод, но я здесь набрал его неправильно, поскольку забыл изменить на меньшее и большее, чем на сущности. Во всяком случае, просматривая код, я заметил, что в атрибуте у меня вместо этого был «ViewModel» или «View» для типа интерфейса, так что это была проблема. Позор мне, извините за беспокойство:)!