Почему все считают, что перечисления нельзя абстрагировать?
Класс System.Enum IS абстракция перечисления.
Вы можете назначить любое значение перечисленияEnum, и вы можете привести его обратно к исходному перечислению или использовать имя или значение.
Например:
Этот небольшой фрагмент кода взят из динамической коллекции свойств, используемой в одном из моихуправляющие библиотеки.Я разрешаю создание свойств и доступ к ним через значение перечисления, чтобы сделать его немного быстрее и меньше человеческих ошибок
/// <summary>
/// creates a new trigger property.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <param name="name"></param>
/// <returns></returns>
protected virtual TriggerProperty<T> Create<T>(T value, Enum name)
{
var pt = new TriggerProperty<T>(value, OnPropertyChanged, Enum.GetName(name.GetType(), name));
_properties[name.GetHashCode()] = pt;
return pt;
}
Я использую Enum.GetName(Type, object)
, чтобы получить имя значения перечисления (чтобы указать имядля свойства), а также по соображениям скорости и согласованности я использую GetHashCode()
для возврата целочисленного значения члена перечисления (хеш-код для int всегда является просто значением int)
Это примервызываемый метод:
public enum Props
{
A, B, C, Color, Type, Region, Centre, Angle
}
public SpecularProperties()
:base("SpecularProperties", null)
{
Create<double>(1, Props.A);
Create<double>(1, Props.B);
Create<double>(1, Props.C);
Create<Color>(Color.Gray, Props.Color);
Create<GradientType>(GradientType.Linear, Props.Type);
Create<RectangleF>(RectangleF.Empty, Props.Region);
Create<PointF>(PointF.Empty, Props.Centre);
Create<float>(0f, Props.Angle);
}