2014-09-10 2 views
0

Im пытается экспортировать все классы, реализующие интерфейс IJob, а также передачу метаданных на уровне отдельного класса. То, что я пробовал:MetaData with InheritedExport

Экспорт:

[InheritedExport(typeof(IJob))] 
public interface IJob 
{ 
    int Run(); 
} 

Импорт:

[ImportMany] 
    public IEnumerable<Lazy<IJob, IJobMetaData>> Jobs { get; set; } 

Реализация:

[IgnoreJob(false)] 
public class MyJob : IJob 
{ 
    public int Run() 
    { 
     return 5; 
    } 
} 

установки атрибутов:

[MetadataAttribute] 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class IgnoreJobAttribute : ExportAttribute, IJobMetaData 
{ 
    public IgnoreJobAttribute(bool ignore) 
     : base(typeof(IJobMetaData)) 
    { 
     Ignore = ignore; 
    } 

    [DefaultValue(true)] 
    public bool Ignore { get; set; } 
} 

выше делает не передать мои метаданные, но если удалить атрибут InheritedExport и добавить атрибут Export к индивидуальной реализации IJob он прекрасно работает ...

+0

Возможный дубликат: http://stackoverflow.com/questions/6570930/how-to-use-mef-inherited-export-metadata –

+0

К сожалению, нет! У них по крайней мере были * некоторые * метаданные, у меня их нет. – InContext

ответ

1

Взгляните на это: How to use MEF Inherited Export & MetaData?

Оказывается, метаданные, связанные с вашим экспортом, должны быть доступны при регистрации InheritedExport. MEF обрабатывает весь экспорт, который производится после наследования данного класса как одного и того же вида экспорта. Поэтому ваши метаданные, определенные в подклассе, игнорируются.

Так что вы не можете использовать InheritedExport в этом случае, я боюсь.

Как я могу видеть, вы уже наследоваться от ExportAttribute в вашем IgnoreJobAttribute Таким образом, вы должны быть в состоянии отказаться от InheritedExportAttribute на базовом классе, до тех пор, как вы держите IgnoreJobAttribute на каждом IJob вы определяете.