【问题标题】:Generate C# enumeration with explicit numerical values from XSD从 XSD 生成具有显式数值的 C# 枚举
【发布时间】:2021-11-08 08:48:18
【问题描述】:

我有一个 XSD,我在其中定义了一个枚举,为每个元素指定数值。它看起来如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://mariusbancila.ro/demo/1.0" xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/" elementFormDefault="qualified" targetNamespace="http://mariusbancila.ro/demo/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="statusCode">
    <xs:restriction base="xs:string">
      <xs:enumeration value="none"/>
      <xs:enumeration value="alpha">
        <xs:annotation>
          <xs:appinfo>
            <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">100</EnumerationValue>
          </xs:appinfo>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="beta">
        <xs:annotation>
          <xs:appinfo>
            <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">200</EnumerationValue>
          </xs:appinfo>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="gamma">
        <xs:annotation>
          <xs:appinfo>
            <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">300</EnumerationValue>
          </xs:appinfo>
        </xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>  
  
   <xs:element name="demo">
     <xs:complexType>
       <xs:sequence>
         <xs:element name="id" type="xs:integer"/>
         <xs:element name="status" type="tns:statusCode"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
  
</xs:schema>

我使用xsd.exe 从中生成 C# 类 (xsd.exe /namespace:Demo /language:cs /c demo.xsd)。结果如下:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mariusbancila.ro/demo/1.0")]
public enum statusCode {
  
  /// <remarks/>
  none,
  
  /// <remarks/>
  alpha,
  
  /// <remarks/>
  beta,
  
  /// <remarks/>
  gamma,
}

我的期望是得到以下结果:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mariusbancila.ro/demo/1.0")]
public enum statusCode {
  
  /// <remarks/>
  none,
  
  /// <remarks/>
  alpha = 100,
  
  /// <remarks/>
  beta = 200,
  
  /// <remarks/>
  gamma = 300,
}

我的问题是这些枚举的数值已存储在数据库中。在下一个版本中,XSD 中的枚举发生了变化,xsd.exe 在之前的枚举值之间生成了新的枚举值。例如:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mariusbancila.ro/demo/2.0")]
public enum statusCode {
  
  /// <remarks/>
  none,
  
  /// <remarks/>
  alpha,
  
  /// <remarks/>
  beta,
  
  /// <remarks/>
  delta, // this is now 3

  /// <remarks/>
  gamma, // this used to be 3, now it's 4
}

这弄乱了系统其他部分对存储数值的处理。

因此,我正在寻找一种方法来生成具有数值的 C# 代码。我知道我可以手动编辑结果,但这很容易出错,并且每次 XSD 更改时都需要手动干预,这是我绝对想要避免的。

【问题讨论】:

    标签: c# enums xsd xsd.exe


    【解决方案1】:

    我不建议您直接在代码中使用这些对象。您需要创建一个Façade,然后将其用作您的代码与丑陋的外部世界之间的桥梁。

    除了外观之外,您可以做的一件事是为您创建一个enum class,并在其中编写一个operator 以将xsd 中提供的枚举转换为您的枚举类。而且,在您的代码中,您只使用您的枚举类。

    结合外观和枚举类,您的代码不知道 xsd 架构的变化。

    【讨论】:

    • 是的,我可以使用一些解决方法。我很好奇xsd.exe 是否有内置的东西可以解决这个问题。
    • 好的,我知道这不会直接回答你,但我还是想试试。它们也不是解决方法。这个想法是不要直接依赖外部的东西,因为这些代码对外部世界的含义与您应用程序内部的含义不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2017-10-25
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多