【问题标题】:C# deserializing enums from integersC# 从整数反序列化枚举
【发布时间】:2012-04-14 05:22:35
【问题描述】:

是否可以从 c# 中的 int 反序列化枚举。例如如果我有以下课程:

class Employee
{
   public string Name { get; set;}
   public int EmployeeTypeID { get; set;}
}

我可以轻松地从 XML 创建它

   <Employee>
       <Name>Joe Bloggs</Name>
       <EmployeeTypeID>1</EmployeeTypeID>
   </Employee>

使用这样的东西:

Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader);

只涉及很少的工作,这允许我使用一个通用服务,我可以通过输入一个选择命令、连接字符串和一个类型来对所有数据库对象使用该服务并检索一个对象数组,而无需进一步映射.但是,我对枚举感到困惑。现在假设 EmployeeType 不是整数,而是枚举:

public enum EmployeeTypeEnum
{
   Admin = 1,
   Sales = 2
}

所以我的班级变成了:

class Employee
{
   public string Name { get; set;}
   public EmployeeTypeEnum EmployeeTypeID { get; set;}
}

能否使用同一个xml,让c#识别xml中EmployeeTypeID的int值应该和enum的int值对应?还有其他类似的问题,但没有一个非常令人满意的答案是相当古老的,并且涉及对代码的大规模更改。我希望有更好的解决方案...

作为一个可能的单独说明(并且稍微期待一些响应),最好避免使用枚举吗?我应该使用键值对吗?如果可能发生更改,我将始终使用键值对(或类似的),但在这种情况下,EmployeeType 是固定的,永远不会改变。

【问题讨论】:

标签: c# .net enums deserialization


【解决方案1】:

理论上(= 我没有尝试过),将 XmlEnum 属性添加到您的枚举值应该可以解决问题:

public enum EmployeeTypeEnum 
{ 
    [XmlEnum("1")] Admin = 1, 
    [XmlEnum("2")] Sales = 2 
} 

这告诉 XmlSerializer EmployeeTypeEnum.Admin 的值将被序列化为字符串1反之亦然(这是您需要的)。

关于您的旁注:我不认为在这里使用枚举是一个问题。如果数据库中的值是整数并且具有固定的含义,那么枚举是一个很好的解决方案,此外,它还可以作为数据库值的文档。

【讨论】:

    【解决方案2】:

    如果你的xml是这种格式:

    <Employee>
      <Name>Shiv</Name>
      <EmployeeTypeID>Sales</EmployeeTypeID>
    </Employee>
    

    它将按原样工作。如果你像这样用 XmlEnum 属性装饰你的枚举:

        public enum EmployeeTypeEnum
    {
        [XmlEnum("1")]
        Admin = 1,
        [XmlEnum("2")]
        Sales = 2
    }
    

    然后您可以在 xml 文件中使用整数值,它们将自动映射到枚举。

    就个人而言,我更喜欢在这种情况下使用枚举。即使枚举中的项目会随着时间的推移而增加,我更喜欢使用枚举。事实上,这样的枚举是从数据库生成的代码,所以在代码中你不使用 Ids(更具可读性)。

    【讨论】:

      【解决方案3】:

      在 xml 文件中,使用命名常量代替整数值。它会工作得很好。

      <Employee>
             <Name>Joe Bloggs</Name>
             <EmployeeTypeID>Admin</EmployeeTypeID>
      </Employee>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-31
        • 2016-10-16
        • 2013-09-01
        • 2019-05-31
        • 2015-07-26
        • 1970-01-01
        • 2021-09-10
        • 2021-11-30
        相关资源
        最近更新 更多