Подтвердить что ты не робот

С# десериализация перечислений из целых чисел

Можно ли десериализовать перечисление из 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);

С очень небольшим количеством работы это позволяет мне использовать один общий сервис, который я могу использовать для всех объектов базы данных, путем подачи команды выбора, строки подключения и типа в и извлечения массива объектов без необходимости дальнейшего сопоставления, Однако я отвязался с перечислениями. Предположим теперь, что вместо целого числа EmployeeType является перечислением:

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

поэтому мой класс будет:

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

Можно ли использовать тот же XML и сделать С# признаем, что значение int EmployeeTypeID в xml должно соответствовать значению int enum? Есть и другие вопросы, подобные там, но ни один из них не удовлетворительный ответ довольно старый и включает в себя оптовые изменения кода. Я надеюсь на лучшее решение...

Как возможная отдельная заметка (и немного в ожидании некоторых ответов), использует перечисления для этого, лучше всего избегать практики? Должен ли я использовать пары "ключ-значение"? Я бы всегда использовал пары Key-value (или аналогичные), если бы были изменения, но в этом случае EmployeeType фиксирован и никогда не изменится.

4b9b3361

Ответ 1

Теоретически (= я не пробовал), добавив атрибут XmlEnum к вашим значениям перечисления, должен сделать трюк:

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

Это говорит XmlSerializer, что значение EmployeeTypeEnum.Admin должно быть сериализовано как строка 1 и наоборот (это то, что вам нужно).

Относительно вашей стороны примечание: я не вижу использование перечислений здесь как проблему. Если значения в базе данных являются целыми числами и имеют фиксированное значение, перечисления являются хорошим решением и, кроме того, служат документацией для значений базы данных.

Ответ 2

Если xml находится в этом формате:

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

Он будет работать так, как есть. Если вы украшаете свой enum атрибутом XmlEnum следующим образом:

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

Затем вы можете использовать целочисленные значения в вашем xml файле, и они будут автоматически сопоставлены с перечислением.

Лично я предпочитаю использовать перечисления в таких случаях. Даже если элементы в перечислении могут увеличиваться с течением времени, я предпочитаю использовать перечисления. Фактически такие перечисления представляют собой код, созданный из базы данных, поэтому в коде вы не работаете с идентификаторами (гораздо более читаемыми).

Ответ 3

В xml файле используйте named constant вместо целочисленного значения. Он будет работать нормально.

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