我正在构建一个基于MEF的以插件为中心的WPF应用程序,我正面临GetExports的问题,也许这只是我的无知,但我发现了一个奇怪的行为。我有许多导出的部分,都来自2个不同的接口(我们将它们命名为A和B),但都标有相同的元数据属性X.所以我的代码如下:
[导出(typeof运算(A))] [TheXAttributeHere ...] 公共类SomePart1:A {...}
每个部分的,以及实现B的类的相同:
[导出(typeof运算(B))] [TheXAttributeHere ...] 公共类SomePart2:B {...}
现在,当我尝试使用某些值来实现由属性X修饰的所有部件实现A 和时,MEF不仅返回A实现部分,还返回B实现部分。因此,当我期望处理A对象时,我得到一个B,从而产生一个强制转换异常。
在现实世界中,接口名为IItemPartEditorViewModel和IItemPartEditorView,而它们的公共属性名为ItemPartEditorAttribute,并公开了一个PartType字符串属性,我在其上进行了一些过滤。因此,我获得零件的代码就像是:
var p = (from l in container.GetExports<IItemPartEditorViewModel, IItemPartEditorMetadata>()
where l.Metadata.PartType == sPartType
select l).FirstOrDefault();
当查找PartType等于某个值的IItemPartEditorViewModel时,我得到了IItemPartEditorView而不是IItemPartEditorViewModel实现对象。如果我在IItemPartEditorView对象中注释掉该属性,我正确地获取了IItemPartEditorViewModel实现对象。
更新使用了建议的“模板化”方法,但我在这里输入错误,因为我忘记改变了lessthan并将其更改为实体。无论如何,检查代码我注意到在属性中我有“ViewModel”而不是“View”用于接口类型,所以这就是问题所在。对我感到羞耻,对不起打扰:)!
答案 0 :(得分:1)
我想我需要看到更多代码,以确定发生了什么。但是,我建议您像这样调用GetExports:
// Get exports of type A
container.GetExports<A>();
// Get exports of type B
container.GetExports<B>();
然后对返回的列表进行过滤。这可能会解决您遇到的演员问题。我也有兴趣看到自定义元数据属性的代码。例如,如果它派生自ExportAttribute,则可能是问题的一部分。