2012-03-30 77 views
12

是否有可能反序列化从int的枚举在c#中。例如如果我有下面的类: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); 

由于涉及很少的工作,这让我使用一个通用的服务,我可以使用所有的数据库对象,通过提供一个选择命令,连接字符串和一个类型,并检索一个对象数组,无需进一步映射。不过,我已经与枚举脱钩了。现在假设,而不是作为一个整数EmployeeType是一个枚举:

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

所以我的课就变成了:

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

我可以使用相同的XML,让C#认识到EmployeeTypeID在XML的int值应该与枚举的int值一致吗?还有其他类似的问题,但没有一个有非常满意的答案,而且涉及批量更改代码。我希望有更好的解决方案...

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

+1

+1 - 我遇到的那些问题之一,我不能证明太多用途,但期待看到答案。 – SkonJeet 2012-03-30 14:05:43

+2

是否http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int帮助? – Bridge 2012-03-30 14:08:24

+0

或http://stackoverflow.com/questions/4250656/deserializing-enums? – kerrubin 2012-03-30 14:09:59

回答

18

理论上(=我还没有尝试过),加入XmlEnum属性的枚举值应该做的伎俩:

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

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

关于你的侧面说明:我没有看到使用枚举这里是一个问题。如果数据库中的值是整数并且具有固定含义,则枚举是一个很好的解决方案,此外还可以作为数据库值的文档。

3

如果XML是格式为:

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

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

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

然后你就可以在你的XML文件中使用整数值,他们将被自动地映射到枚举。

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

0

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

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