Библиотека утилиты перечисления
Я ищу библиотеку с открытым исходным кодом или примеры для работы с типами Enum в .Net. В дополнение к стандартным расширениям, которые люди используют для Enums (TypeParse и т.д.), Мне нужен способ выполнить такие операции, как возврат значения атрибута Description для данного значения перечисления или возврат значения перечисления, которое имеет значение атрибута Description который соответствует заданной строке.
Например:
//if extension method
var race = Race.FromDescription("AA") // returns Race.AfricanAmerican
//and
string raceDescription = Race.AfricanAmerican.GetDescription() //returns "AA"
Ответы
Ответ 1
Если его уже нет, запустите его! Вероятно, вы найдете все методы, которые вам нужны, из других ответов здесь, в Stackoverflow, - просто сверните их в один проект. Вот несколько, чтобы вы начали:
Получение значения перечисления Описание:
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;
}
Получение значения с нулевым значением перечисления из строки:
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;
}
}
Ответ 2
Я прочитал этот пост в блоге на днях об использовании классов вместо перечислений:
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) { }
}