gpt4 book ai didi

.net - 如何在 MEF 中将类型从 typename 传递到 GetExports?

转载 作者:行者123 更新时间:2023-12-01 01:26:44 25 4
gpt4 key购买 nike

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

最佳答案

警告:这不是使用 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();

关于.net - 如何在 MEF 中将类型从 typename 传递到 GetExports?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com