2010-07-15 15 views
37

Sto scrivendo una funzione di utilità che ottiene un numero intero dal database e restituisce un enum digitato all'applicazione.Posso trasmettere da un tipo generico a un enum in C#?

Ecco quello che ho provato a fare (nota passo in un nome di lettore di dati e la colonna al posto del int nella mia vera funzione):

public static T GetEnum<T>(int enumAsInt) 
{ 
    Type enumType = typeof(T); 

    Enum value = (Enum)Enum.ToObject(enumType, enumAsInt); 
    if (Enum.IsDefined(enumType, value) == false) 
    { 
     throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString()); 
    } 

    return (T)value; 
} 

Ma non mi permette di scaccio (T)value dicendo:

Impossibile convertire il tipo "System.Enum" in "T".

Inoltre ho letto un bel po 'di recensioni contrastanti sull'utilizzo di Enum.IsDefined. Per quanto riguarda le prestazioni, sembra molto scarso. In quale altro modo posso garantire un valore valido?

+0

Si noti che se il caso fosse stato in un altro modo, per esempio, devi fare '(Enum) v alue' e ottieni 'Impossibile convertire il tipo 'T' in 'System.Enum'', potresti semplicemente fare un cast' as', come 'value as Enum'. – nawfal

+1

Non è vero (almeno nel mio caso), si ottiene il vecchio 'L'operatore as deve essere utilizzato con un riferimento o un tipo nullable (' Foo.bar 'è un tipo di valore non annullabile). – keithl8041

risposta

58

Ti piace questa:

return (T)(object)value; 
+3

Sarebbe meglio dichiarare inizialmente 'value' come' oggetto'. –

+0

Grazie che sembra compilare. Allora non capisco il motivo dell'errore? Punti bonus se puoi spiegare perché nell'interesse dell'apprendimento :) – Justin

+2

Il compilatore non si rende conto che 'T' è un tipo enum. A quanto ne sa, 'T' potrebbe essere' DateTime'. Pertanto, non puoi eseguire il cast direttamente da qualsiasi tipo diverso da 'object' a' T'. – SLaks

11

Modifica questo:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt); 

a questo:

T value = (T)Enum.ToObject(enumType, enumAsInt); 

e rimuovere il cast :)

Problemi correlati