代码之家  ›  专栏  ›  技术社区  ›  Don Vince

具有xsd.exe生成的类的可空值

  •  11
  • Don Vince  · 技术社区  · 17 年前

    我一直在使用xsd.exe生成用于将XML反序列化为的类。 我在源XSD中有不需要的十进制值:

    <xs:attribute name="Balance" type="xs:decimal" use="optional" />
    

    XSD生成的类生成以下代码:

    private decimal balanceField;
    
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal Balance {
        get {
            return this.balanceField;
        }
        set {
            this.balanceField = value;
        }
    }
    

    我注意到它不能为空。

    如何将该字段生成为可空字段,如下图所示:

    private decimal? balanceField;
    
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal? Balance {
        get {
            return this.balanceField;
        }
        set {
            this.balanceField = value;
        }
    }
    
    3 回复  |  直到 11 年前
        1
  •  9
  •   Michał Powaga Mohamed Aslam    13 年前

    目前,它可以正常工作。我使用的是XSD v2.0.50727.42和:

    <xs:element name="Port" type="xs:int" nillable="true" />
    

    生成你一直在寻找的东西(没有多余的 ...Specified 字段和属性):

    private System.Nullable<int> portField;
    
    [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
    public System.Nullable<int> Port {
        get {
            return this.portField;
        }
        set {
            this.portField = value;
        }
    }
    
        2
  •  5
  •   nhaarman    16 年前

    我相信如果你再加上 nLeabel=“true” 在XML模式定义中,XSD将为该元素创建一个可为空的类型。无论如何,这可能是一个好主意,因为您暗示这个值确实是nillable,这将使您的模式定义在这方面更加明确。

    不幸的是,在这种情况下,它仍然包含相应的“指定”字段。如果希望序列化程序直接服从可为空的值,则需要从生成的代码中手动删除“xxspecified”列。

        3
  •  2
  •   Don Vince    17 年前

    我刚刚注意到它实际上包含了以下代码:

    private bool balanceFieldSpecified;
    
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool BalanceSpecified {
        get {
            return this.balanceFieldSpecified;
        }
        set {
            this.balanceFieldSpecified = value;
        }
    }
    

    它提供了我需要的功能。

    如果有一种优雅的方法可以使用nullable,我会将这个问题保留一段时间。改为类型。

    推荐文章