MEF使用字符串获取导出

时间:2016-06-06 13:28:08

标签: c# mef

是否可以通过只有一个字符串获得导出?部件在容器中,但我只有一个字符串来解析正确的部分。 MEF似乎希望解析类型,而Type.GetType()之类的东西需要硬引用。无法使用通用接口,需要非常具体的部件。

可以更改字符串以匹配所需的字符串。 (我认为)

container.GetExports("ClassLibrary1.Class1")

我还没有使用元数据,但您可以根据元数据字符串进行解析吗?

由于

1 个答案:

答案 0 :(得分:1)

如果您在没有参考类型的情况下尝试获取零件,那么一旦您拥有零件,您希望用该零件完成什么?另请注意,您可以使用typeof或使用通用方法引用没有对象的类型。

这就是为什么MEF通常使用公共接口连接,而不是具体和/或非公共类型。

您正在寻找的是给定类型的默认合同名称,但是查找该默认名称的任何辅助方法都需要Type对象,并且与上述相同。< / p>

编辑:如果您正在尝试查找给定班级的合同名称,则以上情况适用。要区分相同类型的出口,请参阅下文

导出时,您可以specify both a contract name and export type,例如

[Export("Contract", typeof(IInterface))]
public class Part : IInterface { /*...*/ }

这可以让您区分多个部分。如果您希望将部件作为ImportMany指令的一部分导入,则必须 导出它而不使用合同名称,例如

[Export("Contract", typeof(IInterface))]
[Export(typeof(IInterface))]
public class Part : IInterface { /*...*/ }

由于允许属性采用const值,因此在名称集合中指定各个合同名称也很有用,IE

public static class ContractNames
{
    public const string Contract = "Contract";
}

[Export(ContractNames.Contract, typeof(IInterface))]
[Export(typeof(IInterface))]
public class Part : IInterface { /*...*/ }

...
    container.GetExportedValue<IInterface>(ContractNames.Contract);

请注意,上面使用的是GetExportedValue而不是GetExports,因为前者会直接撰写并返回值,而不是导出元数据