带有InheritedExport的MetaData

时间:2014-09-10 16:33:49

标签: c# mef custom-attributes extensibility

我试图导出所有实现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>

1 个答案:

答案 0 :(得分:1)

看看这个:How to use MEF Inherited Export & MetaData?

事实证明,在注册InheritedExport时,与导出关联的元数据必须可用。 MEF将从给定类继承后生成的所有导出视为同一类型的导出。因此,将忽略子类中定义的元数据。

所以在这种情况下你无法使用InheritedExport,我很害怕。

我可以看到,您已经从ExportAttribute中的IgnoreJobAttribute继承,因此,只要您保留了InheritedExportAttribute,就可以将IgnoreJobAttribute放在基类上在你定义的每个IJob上{{1}}。