是否可以从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);
由于涉及的工作很少,这允许我使用一个通用服务,我可以使用一个通用服务,通过将一个select命令,连接字符串和一个类型输入到并检索一个对象数组,而无需进一步的映射。但是我已经忘记了枚举。假设现在而不是整数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是固定的,永远不会更改。
答案 0 :(得分:20)
理论上(=我还没试过),将XmlEnum
属性添加到你的枚举值应该可以解决问题:
public enum EmployeeTypeEnum
{
[XmlEnum("1")] Admin = 1,
[XmlEnum("2")] Sales = 2
}
这告诉XmlSerializer将EmployeeTypeEnum.Admin的值序列化为字符串1
,反之亦然(这是您需要的)。
关于你的旁注:我不认为在这里使用枚举是一个问题。如果数据库中的值是整数并且具有固定含义,则枚举是一个很好的解决方案,此外,还可以作为数据库值的文档。
答案 1 :(得分:3)
如果xml采用以下格式:
<Employee>
<Name>Shiv</Name>
<EmployeeTypeID>Sales</EmployeeTypeID>
</Employee>
它将按原样运作。如果你使用XmlEnum属性装饰你的枚举,如下所示:
public enum EmployeeTypeEnum
{
[XmlEnum("1")]
Admin = 1,
[XmlEnum("2")]
Sales = 2
}
然后你可以在你的xml文件中使用整数值,它们将自动映射到枚举。
就个人而言,我更喜欢在这种情况下使用枚举。即使枚举中的项目可能会随着时间的推移而增加,我更喜欢使用枚举。事实上,这些枚举是从数据库生成的代码,所以在代码中你不能使用ID(更具可读性)。
答案 2 :(得分:0)
在xml文件中,使用命名常量而不是整数值。它会工作得很好。
<Employee>
<Name>Joe Bloggs</Name>
<EmployeeTypeID>Admin</EmployeeTypeID>
</Employee>