我有各种实现特定接口的对象。 在我的代码中的一个地方,我获得了接口的所有导出,并将实际的类名保存在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>
,我会同时获得Something
和SomethingElse
。如果我尝试_container.GetExportedValue<ISomething>("SomethingElse")
,我会收到一个撰写错误,说它无法找到符合约束条件的任何导出。
那么,如何通过只知道类的名称来获取SomethingElse
的新实例呢?
答案 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))]