C# Включают перечисления

У меня есть перечисление:

public enum Status 
{ 
    Incomplete = 1, Complete = 2, Cancelled = 3, Deleted = 4 
}

Теперь на определенной странице я хочу перечислить это перечисление в checkboxlist. Это было бы прекрасно за исключением того, что я хочу, чтобы текст каждого флажка отобразил различный текст, чем перечисление.

т.е. флажки должны сказать:

"Не Обработанный" вместо "Неполного"

"Обработанный" вместо "Полного"

"Пусто" вместо "Отмененного"

Действительно ли возможно поместить это перечисление в foreach и затем включить состояние и обновить текст. Как так:

var statuses = Enum.GetNames(typeof(Status));
foreach (var status in statuses)))
{
    switch (status)
    {
        case Status.Complete.ToString(): 
        status = "Processed";
        break; ...etc                 
    }
}

Любые идеи значительно ценились бы.

5
задан Randy supports Monica 2 July 2010 в 14:09
поделиться

3 ответа

В C # есть языковая функция, которая напрямую отвечает на ваш вопрос. Вот статья , которая дает вам полную информацию.

Краткая версия: примените значения атрибутов расширения к каждому значению:

enum OrderStatus  
{  
    [EnumValueData(Name="New Order")]  
    NewOrder = 1,  
    [EnumValueData(Name="In Process")]  
    Processing = 2,  
    [EnumValueData(Name="Shipped")]  
    Shipped = 3  
}  

Затем примените указанные значения к своим переключателям, списку или чему-то еще:

public static Dictionary<int, string> GetListItems(Type enumType)  
{  
    if (!enumType.IsEnum)  
        throw new ApplicationException("GetListItems does not support non-enum types");  
    Dictionary<int, string> list = new Dictionary<int, string>();  
    foreach(FieldInfo field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public))  
    {  
        int value;  
        string display;  
        value = (int)field.GetValue(null);  
        display = Enum.GetName(enumType, value);  
        foreach(Attribute currAttr in field.GetCustomAttributes(true))  
        {  
            EnumValueDataAttribute valueAttribute = currAttr as EnumValueDataAttribute;  
            if (valueAttribute != null)  
                display = valueAttribute.Name;  
        }  
        list.Add(value, display);  
    }  
    return list;  
}  
14
ответ дан 18 December 2019 в 06:34
поделиться

Вы можете использовать атрибут Description в классе System.ComponentModel для присвоения текстового описания каждому значению перечисления. Затем вы можете установить свойство text, перебирая перечисления и получая атрибут Description каждого из них вместо использования переключателя.

public enum Status
{
    [Description("Not Processed")] Incomplete = 1,
    [Description("Processed")] Complete = 2,
    [Description("Void")] Cancelled = 3,
    Deleted = 4
}

Затем вы можете использовать что-то вроде следующего, чтобы получить описание одного значения перечисления (или модифицировать его, чтобы вернуть словарь, как Боб показал в своем примере):

    public static string GetEnumDescription ( Object value )
    {
        try
        {
            Type objType = value.GetType();
            FieldInfo fldInf = objType.GetField( Enum.GetName( objType, value ) );

            Object[ ] attributes = fldInf.GetCustomAttributes( false );

            if ( attributes.Length > 0 )
            {
                DescriptionAttribute descAttr = ( DescriptionAttribute )attributes[ 0 ];
                return descAttr.Description;
            }
            else
            {
                return value.ToString();
            }
        }
        catch
        {
            return string.Empty;
        }
    }
10
ответ дан 18 December 2019 в 06:34
поделиться

Вы можете поместить строку Modification в массив, а затем использовать индекс перечисления для доступа к элементу массива.

0
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: