1

我有一个包含各种类型节点的对象图。所有节点都派生自一个 Node 类。使用 YamlDotNet,我通过提供自己的IObjectFactory. 剩下要做的唯一一件事就是摆脱只为取悦 YamlDotNet 序列化程序而存在的构造函数。

看看下面的 .NET fiddle 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 回答