是否可以通过只有一个字符串获得导出?部件在容器中,但我只有一个字符串来解析正确的部分。 MEF似乎希望解析类型,而Type.GetType()之类的东西需要硬引用。无法使用通用接口,需要非常具体的部件。
可以更改字符串以匹配所需的字符串。 (我认为)
container.GetExports("ClassLibrary1.Class1")
我还没有使用元数据,但您可以根据元数据字符串进行解析吗?
由于
答案 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
,因为前者会直接撰写并返回值,而不是导出元数据