如何将类型从typename传递到MEF中的GetExports?

时间:2011-09-05 17:36:11

标签: .net mef

我创建了一个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”的字符串变量,我想实现同样的目的。有没有办法按名称传递类型?

1 个答案:

答案 0 :(得分:4)

警告:这不是使用MEF的常规方法。但是,既然你问过......你可以使用接受overload of GetExportsImportDefinition

要发现您必须为给定类型使用哪个合约名称,您可以致电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();