Как передать тип из typename в GetExports в MEF? - PullRequest
4 голосов
/ 05 сентября 2011

Я создал 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 Ответ

4 голосов
/ 06 сентября 2011

Предостережение: это не обычный способ использования MEF.Но так как вы спросили ... вы можете использовать перегрузку 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();
...