2009-10-22 2 views
2

Я ищу библиотеку с открытым исходным кодом или примеры для работы с типами Enum в .Net. В дополнение к стандартным расширениям, которые люди используют для Enums (TypeParse и т. Д.), Мне нужен способ выполнить такие операции, как возврат значения атрибута Description для данного значения перечисления или возврат значения перечисления, которое имеет значение атрибута Description который соответствует заданной строке.Enumeration Utility Library

Например:

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

Там также библиотека Джона Скита для общего перечисления type: http://code.google.com/p/unconstrained-melody/ – TrueWill

+0

Первая часть представляет собой дубликат http://stackoverflow.com/questions/17772/anyone-know-a-quick-way- в-получить доступ к-пользовательских-атрибуты-на-ан-перечисления стоимости. – nawfal

ответ

2

Если не один уже, запустить один! Вероятно, вы найдете все методы, которые вам нужны, из других ответов здесь, в Stackoverflow, - просто сверните их в один проект. Вот несколько, чтобы вы начали:

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

Я прочитал это сообщение в блоге на другой день об использовании классов вместо перечислений:

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

Предлагает использовать абстрактного класса, служащего основой классов перечисления. Базовый класс имеет такие вещи, как равенство, анализировать, сравнивать и т.д.

Используя его, вы можете иметь классы для ваших перечислений, как это (пример, взятый из статьи):

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

Спасибо. В статье приведены некоторые очень хорошие моменты, которые уместны для моей ситуации. –