1

さまざまなタイプのノードを含むオブジェクト グラフがあります。すべてのノードは Node クラスから派生します。YamlDotNet を使用して、独自のIObjectFactory. やるべきことは、YamlDotNet シリアライザーを喜ばせるためだけに存在するコンストラクターを取り除くことだけです。

次の .NET フィドルを ご覧ください https://dotnetfiddle.net/KJMzxD

FancyNode.ctor()削除したいコンストラクターですが、デシリアライザーですべてを処理したことをシリアライザーに伝える方法がわかりません。単純に削除すると、次のエラーが表示されます

型 'FancyNode' は、既定のコンストラクターまたは型コンバーターがないため、逆シリアル化できません。

4

1 に答える 1

0

コンストラクター自体ではなく、パラメーターなしのコンストラクター コードのみを削除する場合 (そのタイプの逆シリアル化に必要な場合)、両方のコンストラクターを削除し、ファクトリ メソッドを使用してノードを作成できます。これにより、デフォルトのパブリック コンストラクターを持つクラスが生成されます。

たとえば、次のように変更します。

public class FancyNode : Node
{
  private IController controller;

  public string ID
  {
      get;
      private set;
  }

  // I would really like to get rid of this constructor
  public FancyNode()
  {
      throw new NotSupportedException();
  }

  // NOTICE: no default constructor here  
  public FancyNode(IController controller, string id)
  {
      this.controller = controller;
      this.ID = id;
  }
}

に:

public class FancyNode : Node
{
    private IController controller;

    public string ID
    {
        get;
        private set;
    }

    public static FancyNode CreateNode(IController controller, string id)
    {
        var node = new FancyNode();
        node.controller = controller;
        node.ID = id;
        return node;
    }
}

はい、誰でもできるようになったので、これらのパラメーターを渡さずにオブジェクトを作成できないという厳密な制御が失われますvar x = new FancyNode()。次に、パラメーターを検証していないため、で呼び出しても違いはありませんnew FancyNode(null, null)

于 2016-12-26T13:28:44.313 に答える