首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除YamlDotNet使用的默认构造函数

删除YamlDotNet使用的默认构造函数
EN

Stack Overflow用户
提问于 2016-12-26 12:11:48
回答 1查看 769关注 0票数 2

我有一个对象图,包含各种类型的节点。所有节点都是从Node类派生的。使用YamlDotNet,通过提供自己的IObjectFactory实现,我成功地序列化和反序列化了图形。唯一要做的事情是摆脱仅为取悦YamlDotNet序列化程序而存在的构造函数。

请看下面的.NET fiddle https://dotnetfiddle.net/KJMzxD

FancyNode.ctor()是我想要删除的构造函数,但我不知道如何告诉序列化程序,我已经处理了反序列化器中的所有内容。如果我简单地删除它,我会得到以下错误

类型'FancyNode‘不能反序列化,因为它没有默认的构造函数或类型转换器。

EN

回答 1

Stack Overflow用户

发布于 2016-12-26 13:28:44

如果您只想摆脱无参数构造函数代码,而不是构造函数本身--鉴于这种反序列化是必需的--您可以移除两个构造函数,并使用工厂方法创建节点。这将导致类具有默认的公共构造函数。

例如,更改:

公共类FancyNode :节点{私有IController控制器;公共字符串ID { get;} // i确实希望摆脱此构造函数公共FancyNode() {抛出新的NotSupportedException();} //通知:这里没有默认的构造函数--公共FancyNode(IController控制器,字符串id) { this.controller =控制器;this.ID = id;}}

至:

代码语言:javascript
复制
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)调用它没有什么区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41331080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档