Вопрос

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

Например:

//if extension method
var race = Race.FromDescription("AA") // returns Race.AfricanAmerican
//and
string raceDescription = Race.AfricanAmerican.GetDescription() //returns "AA"
Это было полезно?

Решение

Если его еще нет, запустите его!Вероятно, вы можете найти все нужные вам методы из других ответов здесь, в 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;
}

Получение нулевого значения enum из 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;
    }
}

Другие советы

На днях я прочитал этот пост в блоге об использовании классов вместо перечислений.

http: //www.lostechies .com / блоги / jimmy_bogard / Архив / 2008/08/12 / перечисление-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) { }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top