【问题标题】:Nullable value with xsd.exe generated classxsd.exe 生成的类的可为空值
【发布时间】:2009-09-14 11:12:14
【问题描述】:

我一直在使用 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;
    }
}

【问题讨论】:

    标签: c# .net-2.0 code-generation xsd.exe


    【解决方案1】:

    目前它可以正常工作。我正在使用 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;
        }
    }
    

    【讨论】:

    • 这仅适用于元素,不适用于最初提出的问题的属性。
    • 这是巧合,因为 minOccurs 的默认值为 1 如果将其更改为 minOccurs="0",则必须使用 IsPortSpecified 才能强制显示空值。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      它提供了我需要的功能。

      如果有一种优雅的方式可以利用可空值,我会暂时搁置这个问题?而是输入。

      【讨论】:

      • 不幸的是,xsd.exe 早于 .NET 框架中存在的可空类型,因此他们必须想出一个在任何情况下都有效的解决方案。我不知道有什么方法可以告诉 xsd.exe 使用可空类型......(总有一天有人应该站出来创建一个有用的 xsd.exe 替代品!:-))
      • 对于 xsd.exe 生成的数据集也存在类似的问题,除了该行将包含 IsBalanceNull() 方法而不是属性。
      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 2012-01-09
      • 2011-05-18
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多