2012-03-30 12 views
12

E 'possibile deserializzare un enum da un int in C#. per esempio. Se ho la seguente classe:C# deserializing enum from interi

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

posso creare facilmente questo da XML

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

usando qualcosa di simile:

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

Con poco lavoro in questione, questo mi permette di utilizzare un servizio generico che posso utilizzare per tutti gli oggetti del database inserendo un comando select, una stringa di connessione e un tipo in e recuperare una matrice di oggetti senza alcuna necessità di ulteriore mappatura. Tuttavia mi sono scollato con le enumerazioni. Supponendo ora invece di essere un EmployeeType intero è un enum:

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

così la mia classe diventa:

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

Posso usare lo stesso XML e fare C# riconoscono che il valore int di EmployeeTypeID in xml dovrebbe corrispondere al valore int dell'enum? Ci sono altre domande simili là fuori, ma nessuna ha una risposta molto soddisfacente sono piuttosto vecchie e implicano modifiche all'ingrosso al codice. Sto sperando in una soluzione migliore ...

Come una possibile nota a parte (e leggermente in previsione di alcune risposte), si sta usando l'enumerazione per questo una pratica meglio evitata? Devo usare coppie chiave-valore? Userei sempre coppie di valori-chiave (o simili) se ci fossero probabilmente dei cambiamenti, ma in questo caso EmployeeType è fisso e non cambierà mai.

+1

+1 - una di quelle domande che ho trovato non posso essere di grande utilità, ma non vedo l'ora di vedere la risposta. – SkonJeet

+2

http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int help? – Bridge

+0

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

risposta

18

Teoricamente (= io non l'ho provato), aggiungendo l'attributo XmlEnum ai tuoi valori enum dovrebbe fare il trucco:

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

Questo dice XmlSerializer che un valore di EmployeeTypeEnum.Admin è quello di essere serializzato come stringa 1e viceversa (che è quello che ti serve).

Per quanto riguarda la nota a margine: non vedo l'uso di enumerazioni qui come problema. Se i valori nel database sono interi e hanno un significato fisso, le enumerazioni sono una buona soluzione e, inoltre, servono come documentazione per i valori del database.

3

Se XML è in questo formato:

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

Funzionerà come è. Se decorare la vostra enum con l'attributo XmlEnum in questo modo:

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

quindi è possibile utilizzare valori interi nel file XML e saranno mappati al enum automagicamente.

Personalmente, preferisco usare l'enumerazione in casi come questo. Anche se gli oggetti nell'enum potrebbero aumentare nel tempo, preferisco usare le enumerazioni. In effetti tali enumerazioni sono generate dal codice del database, quindi nel codice non si lavora con Ids (molto più leggibile).

0

Nel file xml, utilizzare named constant al posto del valore intero. Funzionerà bene.

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