我创建了一个CompositionContainer,现在我没有明确地给出类型,而是希望通过使用类型的名称来获取导出。
以下代码工作正常:
var p1Value = p.Container.GetExports<IPlugin, IPluginData>()
.First(ip => ip.Metadata.Param.Equals(
args[1],
StringComparison.OrdinalIgnoreCase))
.Value
.Execute(args.Skip(1).ToArray());
Console.WriteLine(p1Value);
但是如果我有两个包含“IPlugin”和“IPluginData”的字符串变量,我想实现同样的目的。有没有办法按名称传递类型?
答案 0 :(得分:4)
警告:这不是使用MEF的常规方法。但是,既然你问过......你可以使用接受overload of GetExports的ImportDefinition。
要发现您必须为给定类型使用哪个合约名称,您可以致电AttributedModelServices.GetContractName(typeof(IPlugin))
。通常它只是完整的类型名称。
确切的元数据类型并不重要 - 重要的是在其上声明的元数据属性。您可以在下面的requiredMetadata
字典中对其进行描述。
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
string contractName = "SomeNamespace.IPlugin";
var requiredMetadata = new Dictionary<string, Type>();
requiredMetadata["Meta1"] = typeof(string);
requiredMetadata["Meta2"] = typeof(int);
var importDefinition = new ContractBasedImportDefinition(
contractName,
null,
requiredMetadata,
ImportCardinality.ZeroOrMore,
false,
true,
CreationPolicy.Any);
var exports = container.GetExports(importDefinition);
Console.WriteLine(exports.Count());
Console.ReadKey();