我正在尝试编写一个ExportProvider,它根据在Export和Import上找到的元数据有条件地导出。导出元数据很简单:
[Export(typeof(ITestExport))]
[TestExportMetadata(MetadataStr = "A", MetadataInt = 2)]
public class TestExportClass1 : ITestExport
{
}
检查导出元数据并基于它简单地提供导出。我想要为进口做什么是类似的,可能是这样的:
public class TestImportClass1
{
[Import(typeof(ITestExport))]
[TestImportMetadata(MetadataStr = "A", MetadataInt = 2)]
ITestExport MyExportedValue { get; set; }
}
TestImportMetadata的实际签名在这里并不重要,除了我想为导入提供某种元数据,并且能够在满足该导入时引用它。遗憾的是,似乎没有设计的等效过程将元数据应用于导入,就像导出一样。
ExportProvider基类提供了抽象方法:
protected abstract IEnumerable<Export> GetExportsCore(ImportDefinition definition, AtomicComposition atomicComposition);
我认为提供给此方法的ImportDefinition会直接或间接地为我的元数据或至少对ImportAttribute本身提供某种访问,但它似乎没有。
如果按照我描述的方式这是不可能的,那么在满足导入时,是否有人能想到提供和访问导入元数据的替代方法?
答案 0 :(得分:2)
如果您的目标是.NET 4.5,则可以使用Microsoft.Composition NuGet package代替“框内”的MEF版本。这有一些功能差异,并不是替代品,但增加的一项功能是ImportMetadataConstraint
属性:
public class TestImportClass1
{
[Import(typeof(ITestExport))]
[ImportMetadataConstraint("MetadataStr", "A")]
[ImportMetadataConstraint("MetadataInt", 2)]
public ITestExport MyExportedValue { get; set; }
}
这也适用于自定义元数据属性,因此您也可以写:
public class TestImportClass1
{
[Import(typeof(ITestExport))]
[TestExportMetadata(MetadataStr = "A", MetadataInt = 2)]
public ITestExport MyExportedValue { get; set; }
}
(请注意,属性需要公开才能在此处用作导入。)