С# десериализация перечислений из целых чисел
Можно ли десериализовать перечисление из 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 фиксирован и никогда не изменится.
Ответы
Ответ 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>