Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法使用MEF为导入指定元数据?_C#_.net_.net 4.0_Mef_.net 4.5 - Fatal编程技术网

C# 有没有办法使用MEF为导入指定元数据?

C# 有没有办法使用MEF为导入指定元数据?,c#,.net,.net-4.0,mef,.net-4.5,C#,.net,.net 4.0,Mef,.net 4.5,我正在尝试编写一个ExportProvider,它根据在导出和导入中找到的元数据有条件地导出。导出元数据很容易: [Export(typeof(ITestExport))] [TestExportMetadata(MetadataStr = "A", MetadataInt = 2)] public class TestExportClass1 : ITestExport { } 检查导出元数据并基于它提供导出。我想为进口做的是类似的事情,可能是这样的: public class TestIm

我正在尝试编写一个ExportProvider,它根据在导出和导入中找到的元数据有条件地导出。导出元数据很容易:

[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);
受保护的抽象IEnumerable GetExportsCore(导入定义,原子组合原子组合);
我认为提供给这个方法的ImportDefinition可以让我直接或间接地访问元数据,或者至少访问ImportAttribute本身,但它似乎没有


如果这根本不可能像我描述的那样实现,那么有人能想出一种替代方法来提供和访问导入元数据以满足导入要求吗?

如果您的目标是.NET 4.5,您可以使用“机箱中”的MEF版本,而不是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; }
}

(请注意,这些属性必须是公共的,才能用作此处的导入。)

谢谢,我认为这将是一个很大的帮助!