2

この質問とほぼ同じ問題があります: C#/MEF は、パラメーターなしのコンストラクターのない基本クラスでは機能しません。

答えもわかります。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;}
}

あなたの助けのためのthxソコ

4

1 に答える 1

3

C# のオプションの引数は、コンパイル時の「トリック」です。最初のコードによって生成されたコンストラクターには、パラメーターなしのコンストラクターがありません。代わりに、1 つの整数を取り、デフォルト値を提供する属性で装飾されたコンストラクターがあります。それは効果的に次のように書いています。

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

C# コンパイラはこれらの属性を認識しており、この情報を必要とするメソッドまたはコンストラクターを見つけると、コンパイル時に値を "入力" します。

MEF はこれらの属性を検索しません。デフォルトのコンストラクター、または構成された型によって各引数が提供されるコンストラクターが必要です。この場合、最初のバージョンは失敗するため、MEF は型を構築できません。

あなたが示したように、2 つのコンストラクターを使用することは、MEF でこれを処理する正しい方法です。

于 2013-07-10T23:57:22.293 に答える