通过实现类名获取导出的接口

时间:2016-06-17 14:31:18

标签: c# mef

我有各种实现特定接口的对象。 在我的代码中的一个地方,我获得了接口的所有导出,并将实际的类名保存在DB中。这里有一些快速而又脏的伪:

public interface ISomething { }

[Export(typeof(ISomething))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class Something : ISomething { }

[Export(typeof(ISomething))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class SomethingElse : ISomething { }

public class Handler {

    [Import]
    CompositionContainer _container;

    [ImportMany]
    IEnumerable<ISomething> _somethings;

    public void SaveSomething() {
        foreach(ISomething something in _somethings) {
            string className = something.GetType().Fullname;
            SaveToDatabase(className);
        }
    }
}

这很好用,我可以很容易地获得所有的ISomething实现。 但是,我还需要在以后获取特定类名的新实例。

如果我尝试_container.GetExportedValues<ISomething>,我会同时获得SomethingSomethingElse。如果我尝试_container.GetExportedValue<ISomething>("SomethingElse"),我会收到一个撰写错误,说它无法找到符合约束条件的任何导出。

那么,如何通过只知道类的名称来获取SomethingElse的新实例呢?

2 个答案:

答案 0 :(得分:1)

您可以提供两个导出属性,以便您可以按接口名称或自定义名称导入。

这样的事情:

public interface ISomething { }

[Export(typeof(ISomething))]
[Export("Something", typeof(ISomething))]
public class Something : ISomething { }

[Export(typeof(ISomething))]
[Export("SomethingElse", typeof(ISomething))]
public class SomethingElse : ISomething { }

现在,你可以这样做:

class Test
{
    [ImportMany]
    IEnumerable<ISomething> _somethings;

    [Import("SomethingElse", typeof(ISomething))]
    SomethingElse _somethingElse;
}

答案 1 :(得分:0)

您必须导出SomethingElse explicite:

[Export(typeof(SomethingElse))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class SomethingElse : ISomething { }

然后_container.GetExportedValue<SomethingElse>有效。也可以通过给出一个名称来导出同一个类。

[Export("SomethingElse", typeof(ISomething))]