C#/MEF don';不能使用具有默认值的[ImportingConstrutor]

本文关键字:默认值 ImportingConstrutor don MEF 不能 | 更新日期: 2023-09-27 18:22:04

我或多或少有和这个问题相同的问题:C#/MEF没有';t在没有无参数构造函数的情况下使用基类

我也理解答案。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;}
}

谢谢你的帮助Soko

C#/MEF don';不能使用具有默认值的[ImportingConstrutor]

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

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

C#编译器知道这些属性,当它找到需要这些信息的方法或构造函数时,会在编译时"填充"值

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

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