Это можно сделать, и это на самом деле весьма полезно.Вы получаете безопасность типов при установке переменных и возможность динамического поиска.Я бы предпочел видеть меньше кода в дочернем классе, но, тем не менее, он работает хорошо.Вы также можете расширить это и увеличить количество полей в EnumBase, а также переопределить операторы и методы ToString и т. Д. Вы также можете добавить больше обобщений в микс.Это Enums на стероидах.
Отредактировано: чтение нижней части записи
EnumBase:
public class EnumBase
{
public int Val { get; private set; }
public string Description { get; private set; }
private static readonly Dictionary<int, EnumBase> ValueMap = new Dictionary<int, EnumBase>();
protected EnumBase(int v, string desc)
{
Description = desc;
Val = v;
}
protected static void BuildDictionary<T>()
{
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (var field in fields)
{
ValueMap.Add(((EnumBase)field.GetValue(null)).Val, (EnumBase)field.GetValue(null));
}
}
public static EnumBase ValueOf(int i)
{
return ValueMap[i];
}
}
Цвета:
public sealed class Colors : EnumBase
{
public static readonly Colors Red = new Colors(0, "Red");
public static readonly Colors Green = new Colors(1, "Green");
public static readonly Colors Blue = new Colors(2, "Blue");
public static readonly Colors Yellow = new Colors(3, "Yellow");
public Colors(int v, string d) : base(v, d)
{
}
static Colors()
{
BuildDictionary<Colors>();
}
}
Использование:
//example of type safety
var i = Colors.Blue.Val;
//example of dynamic search
Console.WriteLine(Colors.ValueOf(1).Description);
Отредактировано:
Приведенный выше код не работает, если вы наследуете от EnumBase более одного раза (что является огромной проблемой).Статические методы не наследуются, т.е. все дочерние классы просто добавят больше записей в словарь статического базового класса.
Если сценарий использования достаточно силен, вы можете повторно использовать код вместо попытки использовать наследование:
public sealed class Colors
{
public int Val { get; private set; }
public string Description { get; private set; }
private static readonly Dictionary<int, Colors> ValueMap = new Dictionary<int, Colors>();
static Colors()
{
BuildDictionary<Colors>();
}
private static void BuildDictionary<T>()
{
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (var field in fields)
{
ValueMap.Add(((Colors)field.GetValue(null)).Val, (Colors)field.GetValue(null));
}
}
public static Colors ValueOf(int i)
{
return ValueMap[i];
}
private Colors(int v, string desc)
{
Description = desc;
Val = v;
}
public static readonly Colors Red = new Colors(0, "Red");
public static readonly Colors Green = new Colors(1, "Green");
public static readonly Colors Blue = new Colors(2, "Blue");
public static readonly Colors Yellow = new Colors(3, "Yellow");
}