C# 从整数反序列化枚举

标签 c# .net enums deserialization

是否可以在 C# 中从 int 反序列化枚举。例如如果我有以下类(class):

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)变成了:

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

我可以使用相同的 XML 并使 c# 识别 xml 中 EmployeeTypeID 的 int 值应该与枚举的 int 值相对应吗?还有其他类似的问题,但没有一个有一个非常令人满意的答案,这些问题已经很老了,并且涉及对代码的大规模更改。我希望有更好的解决方案...

作为一个可能的单独注释(并且稍微预料到一些响应),是否最好避免为此使用枚举?我应该使用键值对吗?如果可能发生变化,我总是会使用键值对(或类似的),但在这种情况下,EmployeeType 是固定的,永远不会改变。

最佳答案

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

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

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

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

关于C# 从整数反序列化枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944421/

相关文章:

typescript - 如何检查枚举中是否存在给定的字符串键?

c# - 你什么时候想在 C# 中嵌套类?

c# - 访问方法中从类(公共(public)类 TheClass<T>)传入的类型 <T>

c# - 如何使用 XmlSerializer 反序列化具有多个 xmlns 属性的 XML

c# - 任何人都知道一种快速获取枚举值自定义属性的方法吗?

objective-c - 如何使用 typedef 枚举创建 "or' ed"开关?

C#:投影 - 以与 List<string> 相同的方式访问对象集合中给定的字符串属性

c# - CheckForIllegalCrossThreadCalls=false 的后果

.net - Visual Studio 2012 警告 MSB3026 : Could not copy DLL files

.net - 获取 PEM 公钥和私钥或从 PFX 文件