C# 如何列出使用MEF2实现接口的所有类型?

C# 如何列出使用MEF2实现接口的所有类型?,c#,mef,C#,Mef,当我调用CompositionHost.GetExport(“typename”)时,我得到一个请求类型的实例,该实例实现了IInterface,一切正常 当我调用CompositionHost.GetExports()时,我希望得到一个实现IInterface的所有类型的列表,但结果是一个空集合 要么我误解了GetExports()的目的,要么我实现了错误的东西 我的约定如下: conventions.ForTypesDerivedFrom<IInterface>()

当我调用
CompositionHost.GetExport(“typename”)
时,我得到一个请求类型的实例,该实例实现了
IInterface
,一切正常

当我调用
CompositionHost.GetExports()
时,我希望得到一个实现
IInterface
的所有类型的列表,但结果是一个空集合

要么我误解了
GetExports()
的目的,要么我实现了错误的东西

我的约定如下:

conventions.ForTypesDerivedFrom<IInterface>()
           .Export<IInterface>(builder => builder.AsContractName(type => type.Name));
conventions.ForTypesDerivedFrom()
.Export(builder=>builder.AsContractName(type=>type.Name));
我的类型是在没有属性的情况下实现的,只实现
IInterface


有没有一种方法可以使用以这种方式配置的MEF2列出类型?或者我需要改变一些东西来实现这一点吗?

出口合同描述了出口

导出合同可以是类型,也可以是与合同名称组合的类型。通过使用
ExportBuilder.AsContractName
方法,可以显式指定合同名称。因此,您只能按其类型和合同名称导入这些零件

conventions.ForTypesDerivedFrom<IInterface>().Export<IInterface>();
第一个选项是:不要指定合同名称

conventions.ForTypesDerivedFrom<IInterface>().Export<IInterface>();
conventions.ForTypesDerivedFrom().Export();
然后,
GetExports()
将返回该合同类型的所有实例。但是,您将无法通过
GetExport()
导入单个实例,因为容器将引发由多个已知实现引起的异常


顺便说一下,容器总是返回实例。您编写了一个类型列表,但只能从容器中获取实例(实例化的部分)列表。要获取类型列表,您需要管理零件的目录。根据您的环境,您可能无法访问目录

如果您仍然想要同时具有这两个特性(多个实现和单个实现访问),请考虑从合同名转换为元数据。

conventions
    .ForTypesDerivedFrom<IInterface>()
    .Export<IInterface>(builder => builder
        .AsContractType<IInterface>()
        .AddMetadata("ImplementationName", type => type.Name));

var myInstance = container
    .GetExports<Lazy<IInterface, IDictionary<string, object>>>()
    .Where(v => v.Metadata["ImplementationName"] == "YourImplType")
    .FirstOrDefault()?
    .Value;
惯例
.fortypesDrivedFrom()
.Export(builder=>builder
.AsContractType()
.AddMetadata(“ImplementationName”,type=>type.Name));
var myInstance=container
.GetExports()
.Where(v=>v.Metadata[“ImplementationName”]==“YourImplType”)
.FirstOrDefault()?
价值

IDictionary
是一个通用元数据视图,允许您访问部件元数据。

“您写道,您需要一个类型列表,但只能从容器中获取实例(实例化部件)列表。”谢谢,我输入错误-我指的是实例,所以这对我来说很有效。我想避免使用元数据方法,但我肯定会对此进行探索以提供该功能。
conventions
    .ForTypesDerivedFrom<IInterface>()
    .Export<IInterface>(builder => builder
        .AsContractType<IInterface>()
        .AddMetadata("ImplementationName", type => type.Name));

var myInstance = container
    .GetExports<Lazy<IInterface, IDictionary<string, object>>>()
    .Where(v => v.Metadata["ImplementationName"] == "YourImplType")
    .FirstOrDefault()?
    .Value;