Решение Одеда хорошо, но альтернативой, которую я использовал в прошлом, является использование атрибутов, прикрепленных к значениям перечисления, которые содержат соответствующую строку.
Вот что я сделал.
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();
}
}
ОдедРешение, вероятно, работает быстрее, но это решение обладает большой гибкостью.Вы можете добавить целую кучу атрибутов, если действительно хотите.Однако, если вы это сделаете, вам, вероятно, будет лучше создать класс, чем использовать enum!