MEF: найти тип ленивого импорта - PullRequest
2 голосов
/ 22 февраля 2012

Я использовал атрибут InheritedExport, и у меня есть дерево объектов. Подумайте IMessageSender, где у меня есть SmtpSender, TextSender, HttpPostSender. Но через шаблон декоратора у меня есть дополнительные классы, которые также наследуют этот атрибут MEF InheritedExport.

Однако при составлении отправителей я не хочу, чтобы составители были составлены. Теперь Lazy может помочь, тогда как я получаю только те объекты, которые не относятся к типу Decorator. Но я не могу спросить Ленивого, что такое T на самом деле. Возможно, метаданные могли бы помочь, но метаданные применяются только к объекту, который имеет эти метаданные. Я не хочу заставлять разработчиков (читай: разработчиков) добавлять правильные метаданные в их декоратор или отправителя.

Есть идеи? Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 июля 2012

Мне нужно было сделать что-то подобное. В конце концов я решил добавить метаданные, которые дали мне необходимую информацию, но я понимаю, почему это не идеально для вас.

Еще одной возможностью было бы отказаться от использования автоматического импорта через атрибуты и явно вместо этого вызвать CompositionService.GetExports . Тогда вы получите IEnumerable из Export объектов. Это позволит вам получить имя контракта (обычно, но не всегда, имя типа) и метаданные контракта. Я думаю , что метаданные контракта всегда включают имя типа, поэтому у вас будет информация, которую вы ищете.

0 голосов
/ 22 февраля 2012

Вы можете использовать следующий код, чтобы получить тип элемента Lazy:

.GetType().GetProperty("Value").PropertyType
...