Récupère la valeur de Enum en fonction de l’index – c #

Ceci est mon enum:

public enum DocumentTypes { [EnumMember] TYPE_1 = 1, [EnumMember] TYPE_2 = 2, [EnumMember] TYPE_3 = 3, [EnumMember] TYPE_4 = 4, [EnumMember] TYPE_5 = 5, [EnumMember] TYPE_6 = 6, [EnumMember] TYPE_7 = 7, [EnumMember] TYPE_8 = 12 } 

Si je veux obtenir ‘TYPE_8’, si je n’ai que 12 ans, y a-t-il un moyen d’obtenir la valeur enum?

J’ai essayé ceci:

 ((DocumentTypes[])(Enum.GetValues(typeof(DocumentTypes))))[Convert.ToInt32("3")].ToSsortingng() 

qui retourne une valeur de ‘TYPE_4’

 ssortingng str = ""; int value = 12 if (Enum.IsDefined(typeof (DocumentTypes),value)) str = ((DocumentTypes) value).ToSsortingng(); else str = "Invalid Value"; 

Ceci donnera également la possibilité de gérer les valeurs non valides essayant d’être utilisées, sans exception interne.

Vous pouvez également remplacer la chaîne par DocumentTypes, c.-à-d.

 DocumentTypes dt = DocumentTypes.Invalid; // Create an invalid enum if (Enum.IsDefined(typeof (DocumentTypes),value)) dt = (DocumentTypes) value; 

Et pour le point bonus, voici comment append une chaîne personnalisée à une énumération (copiée à partir de cette réponse SO )

 Enum DocumentType { [Description("My Document Type 1")] Type1 = 1, etc... } 

Ajoutez ensuite une méthode d’extension quelque part

 public static ssortingng GetDescription(this object enumerationValue) where T : struct { Type type = enumerationValue.GetType(); if (!type.IsEnum) throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue"); //Tries to find a DescriptionAtsortingbute for a potential friendly name //for the enum MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToSsortingng()); if (memberInfo != null && memberInfo.Length > 0) { object[] attrs = memberInfo[0].GetCustomAtsortingbutes(typeof (DescriptionAtsortingbute), false); if (attrs != null && attrs.Length > 0) { //Pull out the description value return ( (DescriptionAtsortingbute) attrs[0] ).Description; } } //If we have no description atsortingbute, just return the ToSsortingng of the enum return enumerationValue.ToSsortingng(); } 

Ensuite, vous pouvez utiliser:

 DocumentType dt = DocumentType.Type1; ssortingng str = dt.GetDescription(); 

Ce qui resortingve la valeur de l’atsortingbut Description.


Edit – code mis à jour

Voici une nouvelle version de la méthode d’extension qui n’a pas besoin de connaître le type d’Enum à l’avance.

 public static ssortingng GetDescription(this Enum value) { var type = value.GetType(); var memInfo = type.GetMember(value.ToSsortingng()); if (memInfo.Length > 0) { var attrs = memInfo[0].GetCustomAtsortingbutes(typeof(DescriptionAtsortingbute), false); if (attrs.Length > 0) return ((DescriptionAtsortingbute)attrs[0]).Description; } return value.ToSsortingng(); } 

Vous pouvez le lancer directement:

 int value = 12; DocumentTypes dt = (DocumentTypes)value; 

Tout d’abord, lancez votre type enum et appelez ToSsortingng ():

 ssortingng str = ((DocumentTypes)12).ToSsortingng(); 

Essaye ça:

     énumération publique EnumTest
     {
         EnumOne,
         EnumTwo,
         EnumThree,
         Inconnu
     };
     Classe publique EnumTestingClass {
         [STAThread]
         statique vide Main ()
         {
             EnumTest tstEnum = EnumTest.Unknown;
             object objTestEnum;
             objTestEnum = Enum.Parse (tstEnum.GetType (), "EnumThree");
             if (objTestEnum est EnumTest)
             {
                 EnumTest newTestEnum = (EnumTest) objTestEnum;
                 Console.WriteLine ("newTestEnum = {0}", newTestEnum.ToSsortingng ());
             }
         }
     }

À partir de l’exemple de code, vous verrez que newTestEnum aura la valeur de l’équivalent ‘EnumTest’ de la chaîne “EnumThree”.

J’espère que cela vous aidera, Cordialement, Tom.