2

我有或多或少与这个问题相同的问题: C#/MEF doesn't work with a base class without parameterless constructor

我也明白答案。MEF 不知道 val 的值,因此它无法创建实例。

但我没有基本 ctor 调用和 val 的默认值:

[Export(typeof(IPrimitiveDecomposer))]
public class Prim : IPrimitiveDecomposer
{
    [ImportingConstructor] 
    public Prim(int val=0)
    {//some code
    }

    public bool Match(Node node) {return true;}
}

代码编译得很好,但是当我要求它时,MEF 似乎没有 IPrimitiveDecomposer 的导出。当我执行以下操作时,一切正常:

[Export(typeof(IPrimitiveDecomposer))]
public class Prim : IPrimitiveDecomposer
{
    public Prim() : this(0)
    public Prim(int val=0)
    {//some code
    }

    public bool Match(Node node) {return true;}
}

谢谢你的帮助

4

1 回答 1

3

C# 中的可选参数是编译时的“技巧”。您的第一个代码生成的构造函数没有无参数构造函数。相反,它有一个构造函数,它接受一个整数,并用属性修饰以提供默认值。这实际上就像写:

public Prim([Optional, DefaultParameterValue(0)] int val)
{   

C# 编译器知道这些属性,并会在编译时找到需要此信息的方法或构造函数时“填充”该值。

MEF 不查找这些属性。它需要一个默认构造函数,或者每个参数由组合类型提供的构造函数。在这种情况下,您的第一个版本会失败,因此 MEF 无法构造该类型。

正如您所展示的,使用两个构造函数是使用 MEF 处理此问题的正确方法。

于 2013-07-10T23:57:22.293 回答