2012-03-30 39 views
12

Có thể deserialize một enum từ một int trong C#. ví dụ. Nếu tôi có các lớp sau:C# deserializing enums từ số nguyên

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

tôi có thể dễ dàng tạo ra này từ XML

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

sử dụng một cái gì đó như thế này:

Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader); 

Với công việc rất ít tham gia, điều này cho phép tôi sử dụng một dịch vụ chung mà tôi có thể sử dụng cho tất cả các đối tượng cơ sở dữ liệu bằng cách cho ăn một lệnh chọn, chuỗi kết nối và nhập vào và lấy một mảng các đối tượng mà không cần ánh xạ thêm. Tuy nhiên tôi đã đến unstuck với enums. Giả sử bây giờ thay vì trở thành một nhà EmployeeType số nguyên là một enum:

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

nên lớp học của tôi trở thành:

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

Tôi có thể sử dụng XML cùng và làm cho C# nhận ra rằng int giá trị của EmployeeTypeID trong xml phải tương ứng với giá trị int của enum? Có những câu hỏi khác tương tự như vậy, nhưng không có câu trả lời rất thỏa đáng là khá cũ, và liên quan đến việc thay đổi mã bán buôn. Tôi hy vọng cho một giải pháp tốt hơn ...

Như một lưu ý riêng biệt có thể (và hơi dự đoán một số câu trả lời), đang sử dụng enums cho một thực hành tốt nhất nên tránh? Tôi có nên sử dụng cặp khóa-giá trị không? Tôi sẽ luôn sử dụng cặp khóa-giá trị (hoặc tương tự) nếu có khả năng thay đổi, nhưng trong trường hợp này, EmployeeType được sửa và sẽ không bao giờ thay đổi.

+1

+1 - một trong những câu hỏi mà tôi gặp phải mà tôi không thể chứng minh được nhiều việc sử dụng nhưng mong muốn được nhìn thấy câu trả lời. – SkonJeet

+2

http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int có trợ giúp không? – Bridge

+0

Hoặc http://stackoverflow.com/questions/4250656/deserializing-enums? – kerrubin

Trả lời

18

Về mặt lý thuyết (= Tôi đã không thử nó), thêm các XmlEnum thuộc tính với các giá trị enum bạn nên làm các trick:

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

này cho XmlSerializer rằng một giá trị của EmployeeTypeEnum.Admin là phải được tuần tự hóa thành chuỗi 1và ngược lại (đó là những gì bạn cần).

Về lưu ý phụ của bạn: Tôi không thấy sử dụng enums ở đây như là một vấn đề. Nếu các giá trị trong cơ sở dữ liệu là số nguyên và có ý nghĩa cố định, thì enums là một giải pháp tốt và, ngoài ra, còn đóng vai trò như một tài liệu cho các giá trị cơ sở dữ liệu.

3

Nếu bạn XML là ở định dạng này:

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

Nó sẽ làm việc như vậy. Nếu bạn trang trí enum của bạn với các thuộc tính XmlEnum như vậy:

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

Sau đó, bạn có thể sử dụng các giá trị số nguyên trong file xml của bạn và họ sẽ được ánh xạ tới các enum cách tự động.

Cá nhân, tôi thích sử dụng enums trong các trường hợp như thế này. Ngay cả khi các đồ vật trong enum có thể tăng theo thời gian, tôi thích sử dụng enums hơn. Trong thực tế các enums như vậy là mã được tạo ra từ cơ sở dữ liệu, do đó, trong mã bạn không làm việc với các Id (dễ đọc hơn nhiều).

0

Trong tệp xml, Sử dụng hằng số có tên thay cho giá trị số nguyên. Nó sẽ chỉ làm việc tốt.

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