Решение Oded в порядке, но альтернативой, которую я использовал в прошлом, является использование атрибутов, связанных с значениями перечисления, которые содержат соответствующую строку.
Вот что я сделал.
public class DisplayStringAttribute : Attribute
{
private readonly string value;
public string Value
{
get { return value; }
}
public DisplayStringAttribute(string val)
{
value = val;
}
}
Тогда я мог бы определить мое перечисление, как это:
public enum MyState
{
[DisplayString("Ready")]
Ready,
[DisplayString("Not Ready")]
NotReady,
[DisplayString("Error")]
Error
};
И для моих целей, я создал конвертер, чтобы я мог связываться с перечислением:
public class EnumDisplayNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Type t = value.GetType();
if (t.IsEnum)
{
FieldInfo fi = t.GetField(value.ToString());
DisplayStringAttribute[] attrbs = (DisplayStringAttribute[])fi.GetCustomAttributes(typeof(DisplayStringAttribute),
false);
return ((attrbs.Length > 0) && (!String.IsNullOrEmpty(attrbs[0].Value))) ? attrbs[0].Value : value.ToString();
}
else
{
throw new NotImplementedException("Converter is for enum types only");
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
раствора Одед в вероятно, работает быстрее, но это решение имеет большую гибкость. Вы могли бы добавить целую кучу атрибутов, если хотите. Однако, если вы это сделали, вам, вероятно, будет лучше создавать класс, а не использовать перечисление!
'Обратите внимание, что это значение должно быть строкой' - но будут ли все строковые значения строковыми представлениями целых чисел и разными целыми числами? Если это так, вы должны установить целое число, лежащее в основе каждого значения перечисления, а затем написать функцию для правильного преобразования целых чисел в строковое представление, которое вы хотите, например. 2 => «02» и т. Д. – Rawling
+1 Натолкнулся на пример кода для установки значений перечисления в коде, и это, безусловно, более просто, но в моем случае значение также может быть «2a» – PUG
Достаточно справедливо. Bang - простое решение! – Rawling