Comment obtenir la description C# Enum de value? [dupliquer]

possible Duplicate:

obtenir les attributs de la valeur D'Enum

j'ai un enum avec des attributs de Description comme ceci:

public enum MyEnum
{
    Name1 = 1,
    [Description("Here is another")]
    HereIsAnother = 2,
    [Description("Last one")]
    LastOne = 3
}

j'ai trouvé ce bout de code pour retrouver la description basée sur un Enum

public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);

    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}

cela me permet d'écrire du code comme:

var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum))
                         select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };

ce que je veux faire est si je connais la valeur enum (par exemple 1) - Comment puis-je récupérer la description? En d'autres termes, comment puis-je convertir un entier en "valeur Enum" pour passer à ma méthode GetDescription?

316
demandé sur Community 2010-04-16 05:44:00

5 réponses

int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);

le type de données sous-jacent par défaut pour un enum dans C# est un int , vous pouvez simplement le lancer.

308
répondu Nicholas Piasecki 2010-04-16 01:48:04

j'ai implémenté ceci d'une manière générique et sûre dans mélodie sans contrainte -vous utiliseriez:

string description = Enums.GetDescription((MyEnum)value);

:

  • garantit (avec des contraintes de type générique) que la valeur est réellement une valeur enum
  • évite la boxe dans votre solution actuelle
  • cache toutes les descriptions pour éviter d'utiliser la réflexion sur chaque appel
  • a un tas d'autres méthodes, y compris la possibilité de séparer la valeur de la description

je me rends compte que la réponse principale était juste la distribution d'un int à MyEnum , mais si vous faites beaucoup de travail enum, il est intéressant de penser à l'utilisation de la mélodie sans contraintes:)

73
répondu Jon Skeet 2017-07-11 14:49:58

j'ai assemblé le code à partir de la réponse acceptée dans une méthode d'extension générique, afin qu'il puisse être utilisé pour toutes sortes d'objets:

public static string DescriptionAttr<T>(this T source)
{
    FieldInfo fi = source.GetType().GetField(source.ToString());

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute), false);

    if (attributes != null && attributes.Length > 0) return attributes[0].Description;
    else return source.ToString();
}

en utilisant un enum comme dans le post original, ou toute autre classe dont la propriété est décorée avec l'attribut Description, le code peut être consommé comme ceci:

string enumDesc = MyEnum.HereIsAnother.DescriptionAttr();
string classDesc = myInstance.SomeProperty.DescriptionAttr();
59
répondu Irish 2012-06-11 20:02:04

Pour rendre cela plus facile à utiliser, j'ai écrit une extension générique:

public static string ToDescription<TEnum>(this TEnum EnumValue) where TEnum : struct
{
    return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue));
}

maintenant je peux écrire:

        MyEnum my = MyEnum.HereIsAnother;
        string description = my.ToDescription();
        System.Diagnostics.Debug.Print(description);

note: remplacer" Enumerations " ci-dessus par votre nom de classe

24
répondu David 2011-12-05 14:57:00

Vous ne pouvez pas facilement le faire de manière générique: vous ne pouvez convertir un entier à un type spécifique d'enum. Comme Nicholas l'a montré, c'est un cast trivial si vous vous souciez seulement d'un type d'enum, mais si vous voulez écrire une méthode générique qui peut gérer différents types d'enums, les choses deviennent un peu plus compliquées. Vous voulez une méthode du genre:

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)((TEnum)value));  // error!
}

mais il en résulte une erreur de compilation que "int ne peut pas être converti en TEnum" (et si vous travaillez autour de cela ,ce "TEnum ne peut pas être converti en Enum"). Il faut donc tromper le compilateur en insérant des moulages pour objecter:

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)(object)((TEnum)(object)value));  // ugly, but works
}

vous pouvez maintenant appeler cela pour obtenir une description de n'importe quel type d'enum est à portée de main:

GetEnumDescription<MyEnum>(1);
GetEnumDescription<YourEnum>(2);
7
répondu itowlson 2010-04-16 01:57:12