我正在使用MEF,并且我有两个导出具有相同的契约(Contract)类型,但契约(Contract)名称不同

例如:

[Export("TypeA", typeof(MyPlugin))]
[Export("TypeB", typeof(MyPlugin))]

我可以使用各自的契约(Contract)名称来检索每个导出:
ServiceLocator.GetExportedValues<MyPlugin>("TypeA");

但是现在我希望检索实现MyPlugin的所有实例。有什么办法可以做到吗?

我尝试使用以下代码:
ServiceLocator.GetExportedValues<MyPlugin>();

但这没有用。显然,它仅用于检索没有特定契约(Contract)名称的实现。

有什么意见吗?

最佳答案

如果您希望两种方式都可以解析它,那么我将在每个命名的导出旁边添加一个无名导出。例如

// named and nameless
[Export("TypeA", typeof(MyPlugin))]
[Export(typeof(MyPlugin))]

// named nameless, again
[Export("TypeB", typeof(MyPlugin))]
[Export(typeof(MyPlugin))]

class MyPlugin { }


[TestMethod]
public void mef()
{
    var catalog = new AssemblyCatalog(this.GetType().Assembly);
    var container = new CompositionContainer(catalog);

    Assert.AreEqual(2, container.GetExportedValues<MyPlugin>().Count());
}

09-27 13:31