我认为幕后的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的导出值时,我可以通过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。
答案 0 :(得分:1)
确实有办法!无需将导出导入另一个类。只需使用 GetExport&lt; T,TMetadataView&gt; 方法。根据您的代码,我只通过添加:
var wow = c.GetExport<A, IMetadata>();
这会返回您想要的内容, Lazy&lt; T,TMetadataView&gt;
希望这有帮助!