在MEF中不使用ImportAttribute或ImportManyAttribute获取导出的元数据?

时间:2017-10-07 04:41:51

标签: c# prism mef

我认为幕后的ImportAttributeImportManyAttribute应该使用MEF的一些核心方法来获取导出的元数据与导出类型的实际实例配对。使用这些属性可以通过以下设置正常工作:

//the metadata interface
public interface IMetadata {
    string Name {get;}
}
//the custom ExportAttribute
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
[MetadataAttribute]
public class CustomExportAttribute : ExportAttribute, IMetadata {

    public string Name {get;set;}
}
//the class which need to be exported (both value and metadata)
[CustomExport(Name = "someName")]
public class A {
}
//the class which imports the exported value and metadata
[Export]
public class B {
    [Import]
    public Lazy<A, IMetadata> AData {get;set;}
}

现在获取B的导出值时,我可以通过AData接口浏览A正确导出的IMetadata实例及其关联的元数据,如下所示:

var ac = new AggregateCatalog();
ac.Catalogs.Add(new DirectoryCatalog("."));
var c = new CompositionContainer(ac);
var b = c.GetExportedValue<B>();
var data = b.AData.Value;//some instance of A here
var mdata = b.AData.Metadata;//some metadata of A here

但是,在这种情况下我不想使用类B,我怎样才能获得导出的A对及其元数据?由于不使用任何类(如B),因此在这种情况下也不使用属性ImportAttribute。 这是我尝试过的:

var ac = new AggregateCatalog();
ac.Catalogs.Add(new DirectoryCatalog("."));
var c = new CompositionContainer(ac);
var a = c.GetExportedValue<Lazy<A,IMetadata>>();

上面的最后一行抛出异常ImportCardinalityMismatchException,如下所示:

  

未找到与约束匹配的导出:ContractName System.Lazy(Test.A,Test.IMetadata)RequiredTypeIdentity System.Lazy(Test.A,Test.IMetadata)

我认为必须有一些方法可以直接获取导出值(一对类型实例及其元数据)而不使用虚拟类,其中ImportAttribute用于将导出值存储在某些属性中那个班。

我仍然开始使用MEF和Prism。

1 个答案:

答案 0 :(得分:1)

确实有办法!无需将导出导入另一个类。只需使用 GetExport&lt; T,TMetadataView&gt; 方法。根据您的代码,我只通过添加:

var wow = c.GetExport<A, IMetadata>();

这会返回您想要的内容, Lazy&lt; T,TMetadataView&gt;

希望这有帮助!