OK, quindi ho un campo di database di tipo char (1) che ha un piccolo numero di possibili codici di stato (ad esempio 'F' = Fallimento, 'U' = Sconosciuto, ecc.). Mi piacerebbe avere una classe enum C# che corrisponda a questi stati. Posso fare:Come implementare C enum en per il campo del database char (1) enumerato?
public enum StatusCode : byte {
Unknown = (byte) 'U',
Failure = (byte) 'F',
// etc.
}
Fin qui tutto bene. Ma nel DataTable restituito dal database, i valori delle colonne sono istanze System.Data.SqlTypes.SqlString. Ci sono ovviamente alcuni problemi nel convertire da una stringa C# (o anche un carattere C#) in un byte C# (poiché C# char è in realtà un codepoint UTF-16). Ma in questo caso so che i valori sono vincolati a un piccolo insieme e il codice dovrebbe generare un'eccezione se un valore esterno a questo set passa.
Con questo in mente, qual è il modo migliore per farlo? È sicuro lanciare da un SqlString a un byte? Convert.ToByte() sarebbe migliore? Sarebbe meglio usare semplicemente un costrutto switch/case per attraversare i valori nell'enum?
Sto cercando il modo "migliore" per farlo, non solo in termini di risultati corretti ma anche di chiarezza del codice. Suppongo che potrei anche semplicemente usare alcune costanti come
public const char UnknownStatus = 'U';
public const char FailureStatus = 'F';
Ma preferisco usare un enum, se possibile. qualche idea?
Modifica: per chiarire che cosa voglio fare fare con questo, mi aspetto di utilizzare questi valori frequentemente attraverso il mio codice. Ad esempio, voglio essere in grado di fare cose come:
public void DoSomething(StatusCode currentStatus) {
if(currentStatus == StatusCode.Failure) {
throw new SomeException();
}
switch(currentStatus) {
case StatusCode.Unknown:
// do something
break;
}
}
E così via. In particolare mi voglio evitare cose come:
public void DoSomething(char currentStatus) {
if(currentStatus == 'F') {
// do something
}
}
Poiché in questo caso sto usando cosa s'intenda per "numeri magici" in tutto il luogo. In particolare, ciò renderebbe praticamente impossibile la migrazione verso un altro sistema di segnalazione dello stato. Ha senso?
Vedi anche http://stackoverflow.com/questions/1167927/syncing-referential-integrity-tables-and-enums e http://stackoverflow.com/questions/1015058/enum-storage-in- database-field, e in generale, http://stackoverflow.com/search?q=enum%20database&tab=newest –