C# renvoi d'un Enum? à partir d'une statique de la méthode d'extension
J'ai ajouté des méthodes d'extension pour les cordes pour rendre le travail avec quelques énumérations plus facile.
public static Enum ToEnum<T>(this string s)
{
return (Enum)Enum.Parse(typeof(T), s);
}
public static bool IsEnum<T>(this string s)
{
return Enum.IsDefined(typeof(T), s);
}
Remarque: en raison de limitations de type générique contraintes, je dois écrire les méthodes comme ci-dessus. J'aimerais utiliser T ToEnum(ce string s) où T: Enum pour éviter la fonte après avoir fait l'appel ... mais pas faire.
En tout cas, j'ai pensé qu'il serait agréable d'étendre ce concept un peu pour revenir Enum? dans les cas où une signature de méthode peut accepter divers nullable enums.
public static Enum? ToEnumSafe<T>(this string s)
{
return (IsEnum<T>(s) ? (Enum)Enum.Parse(typeof(T), s) : null);
}
Cependant, ce n'est pas dû à des erreurs de compilation.
error CS0453: The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable<T>'
Je dois admettre que je suis un peu confus, ici comme Enum? doit être légitime de la valeur de retour, non?. J'ai essayé quelque chose de similaire, mais à la fin avec la même erreur.
public static T? ToEnumSafe<T>(this string s)
{
return (IsEnum<T>(s) ? (T)Enum.Parse(typeof(T), s) : null);
}
J'ai même décidé de le réécrire les méthodes pour enlever les génériques et je reçois plus de la même chose:
public static bool IsEnum(this string s, Type T)
{
return Enum.IsDefined(T, s);
}
public static Enum? ToEnumSafe(this string s, Type T)
{
return (IsEnum(s, T) ? (Enum)Enum.Parse(T, s) : null);
}
Ai-je raté quelque chose de vraiment stupide ici?
OriginalL'auteur Ethan J. Brown | 2009-10-12
Vous devez vous connecter pour publier un commentaire.
Essayer:
a une surcharge qui prend Type, string, et un booléen cas de la sensibilité d'une opération.
Enfin, c'était ce que je cherchais. Merci
OriginalL'auteur Mehrdad Afshari
Vous pouvez réellement faire un peu mieux que cela - avec un peu de travail.
Bien que C# ne supporte pas les contraintes génériques-à-dire que T doit être un type enum, le CLR ne. J'ai un projet appelé Sans Contrainte Mélodie qui est une bibliothèque de "choses utiles à faire avec un enum." Je le soupçonne déjà débrouille avec ce que vous voulez (tant que vous ne devez utiliser les noms de l'enum, pas la chaîne des représentations des valeurs entières). Bien qu'il n'a pas
IsDefined(string)
, il n'ontTryParse
qui fera le même travail.Voir ce blog pour plus de détails.
Pourquoi
Enum?
n'est pas un type de retour valide -System.Enum
lui-même est un type de référence (tout commeSystem.ValueType
), donc c'est déjà nullable. Vous ne pouvez utiliser?
avec non nullable types de valeur.Génial... c'est une bibliothèque que je n'avais pas rencontré. Sera de le vérifier.
Le lien vers le blog est valide maintenant.
Fixe. J'espère qu'il y aura une masse de remplacement à un certain point, mais je ne suis pas sûr de la plans de.
OriginalL'auteur Jon Skeet
devrait être
pouvez aussi fixer les suivantes
à
return (IsEnum<T>(s) ? (T)Enum.Parse(typeof(T), s) : null);
ne compile pas.shoot manqué un '?'
OriginalL'auteur Dave
Un Enum est pas de Type distinct .Net, il est juste un espace réservé pour un béton de type de valeur (int dans le cas où vous n'avez pas spécifié autrement).
Cela signifie que vous ne pouvez pas l'avoir comme type de déclaration à tous (indépendamment de la statique de l'extension de la méthode ou pas).
Permet de bien dire que vous ne pouvez pas l'avoir comme type pour le but de l'auteur original voulais qu'il se. Parce que d'autres que les trucs qu'il hérite de ValueType et de ses interfaces, il n'a pas non statique des méthodes ou des propriétés.
OriginalL'auteur Foxfire