首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在不使用ImportAttribute或ImportManyAttribute的情况下获取导出的元数据?

在不使用ImportAttribute或ImportManyAttribute的情况下获取导出的元数据?
EN

Stack Overflow用户
提问于 2017-10-07 12:41:51
回答 1查看 310关注 0票数 2

我相信幕后的ImportAttributeImportManyAttribute应该使用MEF的一些核心方法来获得与导出类型的实际实例配对的导出元数据。使用这些属性可以很好地完成以下设置:

代码语言:javascript
复制
//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的导出值时,我可以通过IMetadata接口浏览正确导出的A实例及其关联元数据的AData,如下所示:

代码语言:javascript
复制
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。下面是我尝试过的:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-17 01:08:39

确实有一种方法!不需要在另一个类中导入导出。只需使用GetExport< T,TMetadataView >方法。根据您的代码,我只需添加以下内容即可使其工作:

代码语言:javascript
复制
var wow = c.GetExport<A, IMetadata>();

这正好返回您想要的,一个Lazy < T,TMetadataView >

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46616738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档