XSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举

Posted

技术标签:

【中文标题】XSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举【英文标题】:XSD2Code++, from XML enum to C# enum with not sequential values 【发布时间】:2021-06-13 14:12:25 【问题描述】:

我的项目使用 XSD2Code++ 从 XSD 源文件生成大量 C# 类和枚举。 默认情况下,该工具会生成 C# 枚举,如下例所示:

来自 XSD 定义:

<simpleType name ="AccessResultsEnum">
  <restriction base="string">
    <enumeration value="Unknown"/>
    <enumeration value="AccessAuthorized"/>
    <enumeration value="AccessNotAuthorized"/>
  </restriction>
</simpleType>

转为 C# 枚举类型:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "4.2.0.31")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mycompany.it/MyProject/StateValues/")]
public enum AccessResultsEnum

    /// <remarks/>
    Unknown,
    
    /// <remarks/>
    AccessAuthorized,
    
    /// <remarks/>
    AccessNotAuthorized,

现在,我想用 自定义赋值 生成一个 C# 枚举,如下所示:

public enum AccessResultsEnum

    /// <remarks/>
    Unknown = 0,
    
    /// <remarks/>
    AccessAuthorized = 2,
    
    /// <remarks/>
    AccessNotAuthorized = 63,

有没有办法使用 XSD2Code++ 实现这一点?

我应该将 enum 保留为目标 C# 类型,但我可以更改 XSD AccessResultsEnum 类型定义。

【问题讨论】:

【参考方案1】:

通常我用 get/set 来做

    public class Test
    
        public enum AccessResultsEnum
        
            /// <remarks/>
            Unknown = 0,
            /// <remarks/>
            AccessAuthorized = 2,
            /// <remarks/>
            AccessNotAuthorized = 63,
        
        private AccessResultsEnum _AccessResultsEnum  get;set;
        public string AccessResultsEnum 
            get return _AccessResultsEnum.ToString();
            set _AccessResultsEnum =(AccessResultsEnum)Enum.Parse(typeof(AccessResultsEnum), value);
        
    

【讨论】:

感谢您的回答,但这并不能解决我的问题。我的起点是我必须不时更新的 XSD 定义文件。然后从 XML 我自动生成 C# 代码。我正在寻找一种方法来定义 XML 代码,以便 XSD2Code 生成具有自定义值的 C# 枚举,而不仅仅是默认的整数序列。这使我不必为这些枚举编写容易出错的内部映射代码。 代码不就是这样吗?它采用字符串名称并转换为枚举。 我不想将枚举类型转换为/从其字符串表示。 C# 将内部整数值分配给枚举,但您可以在项目名称后使用“=”运算符分配自定义内部 int 值。好吧,我想要实现的是自动生成的 C# 枚举代码为每个元素分配我的整数值,而不是默认的顺序值。例如,这个伪造的 XML &lt;enumeration value="AccessNotAuthorized" intvalue="63"/&gt; 应该生成这个 C# 枚举项 AccessNotAuthorized = 63。如果我澄清了我的目标,请告诉我。 c# 只是使用枚举名称,它是一个字符串。唯一需要担心数字的情况是当您导入/导出到使用数字而不是字符串的不同应用程序时。因此,在我上面的代码中使用 Enum.Parse() 是外部接口所需要的。 我的项目是一个使用命名枚举从前端应用程序接收命令的中间件。这些枚举由 XSD2Code 生成,它生成一个基本的 C# 枚举,其内部值从 0 开始。后端应用程序(嵌入式设备)使用 int 值。问题是我必须向/从前端和后端应用程序编写映射代码,这是一个容易出错的情况。所以,我想有一种方法来生成 C# 代码,其中枚举具有我的内部值,这样我就可以在前端和后端应用程序使用的值之间进行 1 对 1 匹配。

以上是关于XSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举的主要内容,如果未能解决你的问题,请参考以下文章

是否应该始终默认缺少枚举的 XML 属性?

如何使用 JAXB 从 XML 模式生成 Java 枚举?

如何让 Json.NET 为具有复杂值的属性设置 IsSpecified 属性?

LINQ-to-XML 中 XSD.EXE 的替代方案?

如何从android资源colors.xml创建颜色枚举(int)

怎么取出枚举中的数字值