C#从整数反序列化枚举
是否可以从c#中的int反序列化枚举。 例如,如果我有以下课程:
class Employee { public string Name { get; set;} public int EmployeeTypeID { get; set;} }
我可以轻松地从XML创建它
Joe Bloggs 1
使用这样的东西:
Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader);
由于涉及的工作很少,这允许我使用一个通用服务,我可以通过将select命令,连接字符串和类型输入到并检索对象数组而不需要进一步映射来为所有数据库对象使用。 但是我已经忘记了枚举。 假设现在而不是整数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值应该与enum的int值相对应吗? 还有其他类似的问题,但没有一个非常令人满意的答案是相当陈旧的,并涉及批量更改代码。 我希望有更好的解决方案……
作为一个可能的单独注释(稍微预期一些反应),使用枚举最好避免这种做法? 我应该使用键值对吗? 如果可能有变化,我会一直使用键值对(或类似的),但在这种情况下,EmployeeType是固定的,永远不会改变。
从理论上讲 (=我还没有尝试过),将XmlEnum
属性添加到你的枚举值应该可以解决问题:
public enum EmployeeTypeEnum { [XmlEnum("1")] Admin = 1, [XmlEnum("2")] Sales = 2 }
这告诉XmlSerializer将EmployeeTypeEnum.Admin的值序列化为字符串1
,反之亦然 (这是您需要的)。
关于你的旁注:我不认为在这里使用枚举是一个问题。 如果数据库中的值是整数并且具有固定含义,则枚举是一个很好的解决方案,此外,它还可用作数据库值的文档。
如果xml采用以下格式:
Shiv Sales
它会按原样运作。 如果你使用XmlEnum属性装饰你的枚举,如下所示:
public enum EmployeeTypeEnum { [XmlEnum("1")] Admin = 1, [XmlEnum("2")] Sales = 2 }
然后,您可以在xml文件中使用整数值,它们将自动映射到枚举。
就个人而言,我更喜欢在这种情况下使用枚举。 即使枚举中的项目可能会随着时间的推移而增加,我也更喜欢使用枚举。 事实上,这些枚举是从数据库生成的代码,因此在代码中你不能使用ID(更具可读性)。
在xml文件中,使用命名常量而不是整数值。 它会工作得很好。
Joe Bloggs Admin