У меня есть перечисление:
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
}
}
Любые идеи значительно ценились бы.
В 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;
}
Вы можете использовать атрибут 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;
}
}
Вы можете поместить строку Modification в массив, а затем использовать индекс перечисления для доступа к элементу массива.