C# 从整数反序列化枚举

15

在C#中,是否可以从整数反序列化枚举。例如,如果我有以下类:

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);

使用很少的工作量,我可以通过提供选择命令、连接字符串和类型等信息,从而使用一个通用服务来处理所有数据库对象,并获取一个对象数组,而无需进一步映射。但是,当枚举类型不是整数而是一个枚举值时,我就遇到了一些麻烦:

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

所以我的类变成:

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

我能否使用相同的XML,并使C#识别其中EmployeeTypeID的int值应与枚举类型的int值相对应?虽然有类似的其他问题,但没有一个令人满意的答案,而且这些问题都比较陈旧,需要对代码进行全面更改。我希望有一个更好的解决方案...

作为可能的另一个注意事项(并稍微预期一些回复),使用枚举类型是否是最好避免的做法?我是否应该使用键值对?如果可能会发生更改,我总会使用键值对(或类似的东西),但在这种情况下,EmployeeType是固定的,不会改变。


1
+1 - 这是我遇到的那些问题之一,我无法证明它们有多大用处,但期待看到答案。 - SkonJeet
2
这个帮助链接:https://dev59.com/Z3RB5IYBdhLWcg3wz6QJ 有用吗? - Bridge
还是https://dev59.com/EW855IYBdhLWcg3wm1m3? - kerrubin
@Bridge 是的,那确实帮了很多忙,我一直在搜索“反序列化枚举”,结果错过了那篇文章。 - GarethD
3个回答

23

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

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

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

关于您的附注:我认为在此使用枚举类型并没有问题。如果数据库中的值是整数并具有固定的含义,则枚举类型是一个很好的解决方案,此外还可以作为数据库值的文档。


4
如果您的XML格式如下所示:
<Employee>
  <Name>Shiv</Name>
  <EmployeeTypeID>Sales</EmployeeTypeID>
</Employee>

它将原样工作。如果您使用 XmlEnum 属性装饰枚举,如下所示:

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

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

个人而言,我更喜欢在这种情况下使用枚举。即使枚举中的项随着时间的推移可能会增加,我仍然更喜欢使用枚举。实际上,此类枚举是从数据库生成的代码,因此在代码中,您不需要使用ID(更易读)。


0

在 XML 文件中,使用命名常量而不是整数值。它会正常工作。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接