2012-03-30 5 views
12

Ist es möglich, eine enum von einem int in C# zu deserialisieren. z.B. Wenn ich die folgende Klasse haben:C# deserializing enums von Ganzzahlen

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

ich dies einfach erstellen können von XML

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

so etwas wie dies mit:

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

mit sehr wenig Arbeit beteiligt sind, ermöglicht diese mir Verwenden Sie einen generischen Dienst, den ich für alle Datenbankobjekte verwenden kann, indem Sie einen Auswahlbefehl, eine Verbindungszeichenfolge und einen Typ eingeben und ein Array von Objekten abrufen, ohne dass eine weitere Zuordnung erforderlich ist. Allerdings bin ich mit enums losgekommen. jetzt statt eine ganze Zahl EmployeeType Gesetzt ist eine Enumeration:

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

so meine Klasse wird:

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

Kann ich die gleiche XML verwenden und machen C# erkennen, dass der int-Wert von EmployeeTypeID im xml sollte mit dem int-Wert der enum übereinstimmen? Es gibt andere Fragen, die da draußen ähnlich sind, aber keine haben eine sehr befriedigende Antwort sind ziemlich alt und schließen Großhandelsänderungen zum Code ein. Ich hoffe auf eine bessere Lösung ...

Als eine mögliche separate Notiz (und leicht in Erwartung einiger Antworten), ist die Verwendung von Enums für diese eine Praxis am besten vermieden? Sollte ich Schlüssel-Wert-Paare verwenden? Ich würde immer Schlüssel-Wert-Paare (oder ähnliches) verwenden, wenn es wahrscheinlich Änderungen geben würde, aber in diesem Fall ist EmployeeType fest und wird sich niemals ändern.

+1

+1 - eine jener Fragen, stoße ich auf, dass ich nicht in großem Nutzen unter Beweis stellen kann, sondern freuen uns darauf, die Antwort zu sehen. – SkonJeet

+2

Unterstützt http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-anint Hilfe? – Bridge

+0

Oder http://stackoverflow.com/questions/4250656/deserializing-enums? – kerrubin

Antwort

18

Theoretisch (= ich habe es nicht ausprobiert), Hinzufügen des XmlEnum Attribut auf Ihre Enum-Werte sollte es tun:

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

Dies sagt XmlSerializer, dass ein Wert von EmployeeTypeEnum.Admin sein Serialisiert als die Zeichenfolge 1und umgekehrt (was Sie brauchen).

In Bezug auf Ihre Randnotiz: Ich sehe keine Verwendung von enums hier als ein Problem. Wenn die Werte in der Datenbank Integer sind und eine feste Bedeutung haben, sind Enums eine gute Lösung und dienen darüber hinaus als Dokumentation der Datenbankwerte.

3

Wenn Sie XML ist in diesem Format:

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

Es wie funktioniert ist. Wenn Sie Ihre Enum mit dem XmlEnum Attribut schmücken wie so:

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

Dann können Sie ganzzahlige Werte in der XML-Datei verwenden, und sie werden automatisch auf die Enum abgebildet werden.

Persönlich bevorzuge ich enums in Fällen wie diesem. Auch wenn die Elemente im Enum im Laufe der Zeit zunehmen könnten, bevorzuge ich Enums. In der Tat sind solche Enums Code aus der Datenbank generiert, so dass Sie im Code nicht mit Ids arbeiten (viel besser lesbar).

0

In der XML-Datei verwenden Sie die benannte Konstante anstelle des Ganzzahlwerts. Es wird gut funktionieren.

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