我相信幕后的ImportAttribute
或ImportManyAttribute
应该使用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的导出值时,我可以通过IMetadata
接口浏览正确导出的A
实例及其关联元数据的AData
,如下所示:
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。
发布于 2017-10-17 01:08:39
确实有一种方法!不需要在另一个类中导入导出。只需使用GetExport< T,TMetadataView >方法。根据您的代码,我只需添加以下内容即可使其工作:
var wow = c.GetExport<A, IMetadata>();
这正好返回您想要的,一个Lazy < T,TMetadataView >
希望这能有所帮助!
https://stackoverflow.com/questions/46616738
复制相似问题