我试图导出所有实现IJob
接口的类,同时还在各个类级别传递元数据。我尝试了什么:
出口:
[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
属性并在IJob的单独实现中添加了Export
属性,那么它可以正常工作...... < / p>
答案 0 :(得分:1)
看看这个:How to use MEF Inherited Export & MetaData?
事实证明,在注册InheritedExport时,与导出关联的元数据必须可用。 MEF将从给定类继承后生成的所有导出视为同一类型的导出。因此,将忽略子类中定义的元数据。
所以在这种情况下你无法使用InheritedExport,我很害怕。
我可以看到,您已经从ExportAttribute
中的IgnoreJobAttribute
继承,因此,只要您保留了InheritedExportAttribute
,就可以将IgnoreJobAttribute
放在基类上在你定义的每个IJob上{{1}}。