49 votes

C# Enum.Analyser Les Génériques

J'ai régulièrement demandé pourquoi C# n'a pas encore mis en oeuvre un Générique Enum.Analyser

Disons que j'ai

enum MyEnum
{
   Value1,
   Value2
}

Et à partir d'un fichier XML/DB entrée, je souhaite créer un Enum.

MyEnum val = (MyEnum)Enum.Parse(typeof(MyEnum), "value1", true);

Pourrait-il ne pas avoir été mis en œuvre en tant que quelque chose comme

MyEnum cal = Enum.Parse<MyEnum>("value1");

Cela peut sembler comme un petit problème, mais il semble comme une abstraction d'un.

Toutes les pensées?

43voto

Tomas Vana Points 5686

Il est déjà mis en œuvre .NET 4 ;) de Prendre un coup d'oeil ici.

MyEnum cal;
if (!Enum.TryParse<MyEnum>("value1", out cal))
   throw new Exception("value1 is not valid member of enumeration MyEnum");

Aussi la discussion ici contient quelques points intéressants.

18voto

Ian Boyd Points 50743

Et dans la syntaxe de la question:

MyEnum cal = Toolkit.Parse<MyEnum>("value1");

Remarque: Depuis C# vous interdit l'ajout de statique des extensions, vous avez à la maison de la fonction ailleurs. j'utilise un statique Toolkit classe qui contient tous ces bits utiles:

/// <summary>
/// Converts the string representation of the name or numeric value of one or
//  more enumerated constants to an equivalent enumerated object.
/// </summary>
/// <typeparam name="TEnum">An enumeration type.</typeparam>
/// <param name="value">A string containing the name or value to convert.</param>
/// <returns>An object of type TEnum whose value is represented by value</returns>
/// <exception cref="System.ArgumentNullException">enumType or value is null.</exception>
/// <exception cref=" System.ArgumentException"> enumType is not an System.Enum. -or- 
/// value is either an empty string or only contains white space.-or- 
/// value is a name, but not one of the named constants defined for the enumeration.</exception>
/// <exception cref="System.OverflowException">value is outside the range of the underlying type of enumType.</exception>
public static TEnum Parse<TEnum>(String value) where TEnum : struct
{
   return (TEnum)Enum.Parse(typeof(TEnum), value);
}

8voto

kvb Points 35490

Bien que la limitation de System.Enum n'est pas autorisé en C#, il est admis dans .NET et C# peut utiliser des types ou des méthodes à de telles contraintes. Voir Jon Skeet la Contrainte de la Mélodie de la bibliothèque, qui contient le code qui fait exactement ce que vous voulez.

0voto

Jose Tepedino Points 71

Tout en peaufinant un peu avec certaines méthodes, à essayer de construire quelque chose de similaire à la proposition initiale:

MyEnum cal = Enum.Parse<MyEnum>("value1");

il me semblait que cette syntaxe ne sera pas possible en C#, depuis le type Enum est considérée comme non nullable.

Si nous appelons le "Enum.TryParse" la méthode passage d'une valeur ne correspondant pas à un élément de l'enum les Enums la valeur par défaut sera retourné dans le "dehors" à la variable. C'est pourquoi nous avons besoin de tester le "Enum.TryParse" suite première, depuis le simple appel

MyEnum cal;
Enum.TryParse<MyEnum>("value1", out cal);

et la vérification de la "cal" valeur ne sera pas toujours donner un résultat fiable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X