簡體   English   中英

使用來自 XSD 的顯式數值生成 C# 枚舉

[英]Generate C# enumeration with explicit numerical values from XSD

我有一個 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 更改時都需要手動干預,這是我絕對想避免的。

我不建議您直接在代碼中使用這些對象。 您需要創建一個Façade ,然后將其用作您的代碼和丑陋的外部世界之間的橋梁。

除了外觀之外,您可以做的一件事是為您創建一個枚舉類,並在其中編寫一個運算符,以將 xsd 中提供的枚舉轉換為您的枚舉類。 而且,在您的代碼中,您只使用枚舉類。

結合 façade 和 enum 類,您的代碼不知道 xsd 模式中的更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM