2009-09-24 7 views
1

I habituellement accès Description ENUM pour une valeur correspondante comme:Pouvez-vous accéder à une description longue pour une valeur spécifique ENUM

Enum.GetName (typeof (MyEnum), myid);

je dois avoir un ENUM qui pourrait utiliser des caractères comme « bonjour% du monde^$ £% & »

J'ai vu des gens attachés un attribut et l'ajout d'extensions comme ici:

http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx

mais je ne peux pas travailler si cela peut être utilisé pour accéder à la description longue.

Quelqu'un a-t-il fait quelque chose de similaire?

Merci

Davy

+1

Pour plus de clarté, pouvez-vous poster un exemple d'énumération comme celle que vous aimeriez utiliser? – HitLikeAHammer

+0

Pourquoi vos noms d'énumération sont-ils si longs? Typiquement, une énumération est simplement un moyen mnémotechnique pour le programmeur de se référer à des valeurs numériques dans le code PAS un moyen de stocker des valeurs de chaîne. En général, la récupération des noms est sensibile lorsque vous donnez à un utilisateur la possibilité de sélectionner une valeur donnée à partir de l'énumération ou à des fins d'affichage. – Achilles

+0

@Achilles: Habituellement l'enum aura un texte descriptif pour l'accompagner, d'où la raison pour les noms longs. – NotMe

Répondre

5

Pourquoi ça ne marche pas?

Vous pouvez créer votre propre attribut par inherting de Attribute

public class EnumInformation: Attribute 
{ 
    public string LongDescription { get; set; } 
    public string ShortDescription { get; set; } 
} 

public static string GetLongDescription(this Enum value) 
{ 
    // Get the type 
    Type type = value.GetType(); 

    // Get fieldinfo for this type 
    FieldInfo fieldInfo = type.GetField(value.ToString()); 

    // Get the stringvalue attributes 
    EnumInformation [] attribs = fieldInfo.GetCustomAttributes(
     typeof(EnumInformation), false) as EnumInformation []; 

    // Return the first if there was a match. 
    return attribs != null && attribs.Length > 0 ? attribs[0].LongDescription : null; 
} 

public static string GetShortDescription(this Enum value) 
{ 
    // Get the type 
    Type type = value.GetType(); 

    // Get fieldinfo for this type 
    FieldInfo fieldInfo = type.GetField(value.ToString()); 

    // Get the stringvalue attributes 
    EnumInformation [] attribs = fieldInfo.GetCustomAttributes(
     typeof(EnumInformation), false) as EnumInformation []; 

    // Return the first if there was a match. 
    return attribs != null && attribs.Length > 0 ? attribs[0].ShortDescription : null; 
} 

Votre Enum ressemblerait à ceci

public enum MyEnum 
{ 
    [EnumInformation(LongDescription="This is the Number 1", ShortDescription= "1")] 
    One, 
    [EnumInformation(LongDescription = "This is the Number Two", ShortDescription = "2")] 
    Two 
} 

Vous pouvez l'utiliser de cette façon

MyEnum test1 = MyEnum.One; 

Console.WriteLine("test1.GetLongDescription = {0}", test1.GetLongDescription()); 
Console.WriteLine("test1.GetShortDescription = {0}", test1.GetShortDescription()); 

Il produit

test1.GetLongDescription = Ceci est le numéro 1

test1.GetShortDescription = 1

Vous pouvez réellement ajouter des propriétés à l'attribut d'avoir toutes sortes d'informations. Ensuite, vous pourriez soutenir la localisation que vous recherchez.

+0

J'en ai un mais cela me permet seulement de dire MyEnum, MyDesc.GetstringValue() comme dans le lien que j'ai joint. je devrais alors faire quelque chose de désordonné comme: si (Enum.GetName (typeof (MyEnum), myid) == "RPI1" retourner PriceIndex.RPI1.GetstringValue(); else if (Enum.GetName (typeof (MyEnum), myid) == "RPI2" return PriceIndex.RPI2.GetstringValue(); Messy :( – Davy

+0

Voir mon édition, vous pouvez y accéder à droite du type –

+0

Dans votre exemple de l'enum, il est dit: [LongDescription (LongDescription = "Ceci est le numéro 1", ShortDescription = "1")]. Cela ne devrait-il pas être [EnumInformation (LongDescription = "Ceci est le numéro 1", ShortDescription = "1")]? –

2

Que voulez-vous dire par "description longue"? J'ai un library qui vous permet d'attacher Description attributs aux valeurs ENUM et les chercher:

public enum Foo 
{ 
    [Description("This is a really nice piece of text")] 
    FirstValue, 
    [Description("Short but sweet")] 
    Second, 
} 

Si vous parlez de la documentation XML, qui est une autre affaire - qui ne se construit pas dans la binaire, vous devrez donc également compiler/expédier le XML, puis le récupérer au moment de l'exécution. C'est faisable, mais je n'ai pas de code pour le faire à la main ...

+1

Pourquoi est-ce que vous wiki ceci? –

+0

@Jay: Je fais tout mon post s CW jusqu'à lundi comme une sorte de mesure de célébration. –

+0

Je stocke un int dans DB. Comment puis-je lire cette valeur à partir d'une base de données, puis obtenir le "Ceci est un très bon bit de texte" à afficher pour cette ligne au lieu de "FirstValue"? – Davy

0

J'ai tendance à rester loin de cette pratique. Si vous y réfléchissez, cela lie la logique de votre code à la façon dont vous avez tapé votre code. Il serait préférable d'utiliser une instruction switch, un fichier de ressources, une base de données, etc ...

J'ai appris cela à la dure. J'ai eu une application que nous avons finalement décidé d'obscurcir pour aider à sécuriser notre code. Comme vous pouvez l'imaginer, nos binaires ont cessé de fonctionner comme nous le souhaitions car les enums ont été renommés pendant l'obscurcissement.

+0

merci - je suis d'accord mais on m'a demandé de le faire - montrera ces réponses utiles au patron :) – Davy

0

Si vous avez besoin d'un moyen facile d'extraire un attribut de description pour une valeur ENUM, jetez un oeil à my answer to a similar question

Vous avez juste besoin d'appeler la méthode d'extension GetDescription sur la valeur:

string description = myEnumValue.GetDescription(); 

Le Unconstrained Melody bibliothèque mentionnée par Jon comprend une méthode d'extension similaire (parmi beaucoup d'autres choses cool), vous devriez vérifier.

Questions connexes