2016-09-23 2 views
0

J'ai un type enum défini comme suit:Enum pas par défaut à 0 lorsqu'ils ne sont pas définis

public enum OperationTypeEnum : byte 
{ 
    /// <remarks/> 
    @__NONE = 0, 

    /// <remarks/> 
    Sale = 1, 

    /// <remarks/> 
    Auth = 2 
} 

Dans mon code, je jette un entier comme ceci:

var operationType = (OperationTypeEnum) anotherIntVariable; 

Lorsque anotherIntVariable est quelque chose d'indéfini (par exemple 5), j'espère obtenir 0 ou __NONE de retour (puisque 5 n'est pas défini comme l'une des valeurs d'énumération valides, mais j'en reçois 5 à la place.)

Que dois-je changer pour rendre des valeurs enum non définies à être 0?

Merci!

+2

Je pense que vous êtes le premier à avoir ce problème, et si vous effectuez une recherche sur Internet, vous ne trouverez rien . – Pieter21

+0

regardez [cette question] (http://stackoverflow.com/questions/1758321/casting-ints-to-enums-in-c-sharp) – Jonesopolis

+0

Vous devrez ajouter une validation au-dessus de votre énumération (par ex. Fonction GetValue ou quelque chose) - il n'y a rien de construit pour le faire. –

Répondre

1

Les entiers C# sont effectivement des entiers et il n'y a pas de vérification de compilation ou d'exécution que vous utilisez une valeur "valide" de votre ensemble d'énumération défini. Voir cette réponse pour plus d'informations https://stackoverflow.com/a/6413841/1724034

+0

On dirait que je dois écrire ma propre méthode d'extension pour vérifier l'entier et le mettre par défaut à 0 s'il n'est pas défini. Merci! – AngieM

+0

Bonne réflexion :) – plast1k

+0

'if (Enum.IsDefined (typeof (YourEnum), 5))' ..... –

0

Si vous obtenez une valeur numérique et que vous devez seulement obtenir des valeurs de ENUM réelles, vous pouvez utiliser Enum.TryParse

L'exemple affiche la sortie suivante:
Converti « 0 » Aucun.
Conversion de «2» en vert.
8 n'est pas une valeur sous-jacente de l'énumération des couleurs.
bleu n'est pas un membre de l'énumération Couleurs.
Conversion de «bleu» en bleu.
Le jaune n'est pas membre de l'énumération Couleurs.

using System; 

[Flags] enum Colors { None=0, Red = 1, Green = 2, Blue = 4 }; 

public class Example 
{ 
    public static void Main() 
    { 
     string[] colorStrings = { "0", "2", "8", "blue", "Blue", "Yellow", "Red, Green" }; 
     foreach (string colorString in colorStrings) 
     { 
      Colors colorValue; 
      if (Enum.TryParse(colorString, out colorValue))   
      if (Enum.IsDefined(typeof(Colors), colorValue) | colorValue.ToString().Contains(",")) 
       Console.WriteLine("Converted '{0}' to {1}.", colorString, colorValue.ToString()); 
      else 
       Console.WriteLine("{0} is not an underlying value of the Colors enumeration.", colorString); 
      else 
      Console.WriteLine("{0} is not a member of the Colors enumeration.", colorString); 
     } 
    } 
} 
+0

Merci! Nous avons beaucoup de ces coulées d'énumération dans notre code, alors j'espérais juste manquer quelque chose de simple, mais je suppose que non :). J'écrirai une méthode d'extension pour gérer toutes ces valeurs enum non définies. – AngieM

+1

Veuillez prendre en compte que 'Enum.IsDefined' utilise Reflection donc c'est cher. –

0

La méthode la plus sûre est de créer une méthode d'extension pour votre classe ENUM qui permettra de comparer les valeurs enum et si aucun d'entre eux on crée un @__NONE

Si vous êtes certain il y a seulement un nombre limité quantité de valeurs ENUM:

public static class OperationTypeEnumExtensions 
{ 
    public static OperationTypeEnum ToOperationTypeEnum(this int val) 
    { 
     switch (val) 
     { 
      case (int) OperatinTypeEnum.Sale: 
       return OperationTypeEnum.Sale; 

      cast (int) OperationTypeEnum.Auth: 
       return OperationTypeenum.Auth; 

      default: 
       return [email protected]_none; 
     } 
    } 
} 

Utilisation:

int myInt = GetMyIntValue(); 
OperationTypeEnum myEnum = myInt.ToOperationTypeEnum(); 
1

La réponse a été donnée par @ plast1k.

Voici une extension générique pour votre problème

public static class OperationTypeEnumExtensions 
{ 
    public static T ToEnum<T>(this byte val) where T : struct 
    { 
     if(Enum.IsDefined(typeof(T), val)) 
      return (T) Enum.Parse(typeof(T), val.ToString()); 
     return default(T); 
    } 
} 

utilisation

value.ToEnum<OperationTypeEnum>() 
+0

Merci beaucoup pour votre aide! Cela fonctionne à merveille pour mon problème! – AngieM