Puis-je effectuer un cast d'un type générique à un enum en C#?
Je suis en train d'écrire une fonction d'utilité qui obtient un nombre entier à partir de la base de données et renvoie un typée enum pour l'application.
Voici ce que j'ai essayé de faire (remarque je passe dans un lecteur de données et le nom de la colonne à la place de la int
dans ma vraie fonction):
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;
}
Mais il ne me laisse pas coulé (T)value
disant:
Ne peut pas convertir le type de Système.Enum' à 'T'.
Aussi j'ai lu pas mal de critiques mitigées sur l'utilisation de Enum.IsDefined
. Performance sage, il semble très pauvres. Sinon, comment puis-je garantir une valeur valide?
- Notez que si l'affaire avait été inverse, dire, vous avez à faire
(Enum)value
et vous obtenezCannot convert type 'T' to 'System.Enum'
, vous pouvez simplement faire unas
cast, commevalue as Enum
. - Pas vrai (au moins dans mon cas), vous obtenez le vieux " L'opérateur doit être utilisé avec une référence ou type nullable ('Foo.bar " est un non nullable valeur type) erreur.
Vous devez vous connecter pour publier un commentaire.
Comme ceci:
value
comme unobject
.T
est un type enum. Aussi loin qu'il est conscient,T
pourrait êtreDateTime
. Par conséquent, vous ne pouvez lancer directement à partir de n'importe quel type autre queobject
àT
.__makeref
choseChanger cela:
à ceci:
et retirer le plâtre 🙂
Pour plus d'informations, à l'aide de la contrainte générique
Enum
est disponible à partir de C# 7.3 et plus.