2009-10-22 8 views
2

Je suis à la recherche d'une bibliothèque Open Source ou d'exemples pour travailler avec les types Enum dans .Net. En plus des extensions standard que les gens utilisent pour Enums (TypeParse, etc.), j'ai besoin d'un moyen d'effectuer des opérations comme retourner la valeur de l'attribut Description pour une valeur d'énumération donnée ou retourner une valeur d'énumération ayant une valeur d'attribut Description qui correspond à une chaîne donnée.Enumeration Utility Library

Par exemple:

//if extension method 
var race = Race.FromDescription("AA") // returns Race.AfricanAmerican 
//and 
string raceDescription = Race.AfricanAmerican.GetDescription() //returns "AA" 
+1

Il y a aussi la bibliothèque de Jon Skeet pour ENUM générique contraintes de type: http://code.google.com/p/unconstrained-melody/ – TrueWill

+0

la première partie est un doublon de http://stackoverflow.com/questions/17772/anyone-know-a-quick-way- to-get-to-custom-attributs-on-an-enum-valeur. – nawfal

Répondre

2

S'il n'y a pas déjà, commencer un! Vous pouvez probablement trouver toutes les méthodes dont vous avez besoin d'autres réponses ici sur Stackoverflow - juste les rouler dans un seul projet. Voici quelques-uns pour vous aider à démarrer:

Getting value of enum Description:

public static string GetDescription(this Enum value) 
{ 
    FieldInfo field = value.GetType().GetField(value.ToString()); 
    object[] attribs = field.GetCustomAttributes(typeof(DescriptionAttribute), true)); 
    if(attribs.Length > 0) 
    { 
     return ((DescriptionAttribute)attribs[0]).Description; 
    } 
    return string.Empty; 
} 

Getting a nullable enum value from string:

public static class EnumUtils 
{ 
    public static Nullable<T> Parse<T>(string input) where T : struct 
    { 
     //since we cant do a generic type constraint 
     if (!typeof(T).IsEnum) 
     { 
      throw new ArgumentException("Generic Type 'T' must be an Enum"); 
     } 
     if (!string.IsNullOrEmpty(input)) 
     { 
      if (Enum.GetNames(typeof(T)).Any(
        e => e.Trim().ToUpperInvariant() == input.Trim().ToUpperInvariant())) 
      { 
       return (T)Enum.Parse(typeof(T), input, true); 
      } 
     } 
     return null; 
    } 
} 
3

Je lis ce billet de blog l'autre jour en utilisant des classes au lieu de énumérations:

http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/08/12/enumeration-classes.aspx

Propose l'utilisation d'une classe abstraite pour servir de base aux classes enum. La classe de base a des choses comme l'égalité, parser, comparer, etc.

utilisant, vous pouvez avoir des classes pour vos énumérations comme celui-ci (exemple tiré de l'article):

public class EmployeeType : Enumeration 
{ 
    public static readonly EmployeeType Manager 
     = new EmployeeType(0, "Manager"); 
    public static readonly EmployeeType Servant 
     = new EmployeeType(1, "Servant"); 
    public static readonly EmployeeType AssistantToTheRegionalManager 
     = new EmployeeType(2, "Assistant to the Regional Manager"); 

    private EmployeeType() { } 
    private EmployeeType(int value, string displayName) : base(value, displayName) { } 
} 
+0

Merci quip. L'article fait de très bons points qui sont pertinents à ma situation. –