Я создаю приложение, которое сильно использует Enum
для пользовательских данных. По существу, объект хранится в базе данных с примерно 28 отдельными атрибутами. Каждый атрибут представляет собой двухсимвольное поле, которое переводится с SQL прямо на Enum
.
К сожалению, мне нужно также перевести эти значения в два разных для человека значения. Один для легенды в таблице данных и один для класса CSS для стилизации изображения в интерфейсе веб-приложения.
Для этого я настроил два настраиваемых атрибута и применил их к Enum
там, где это необходимо. Например:
Пользовательский интерфейс атрибутов
public interface IAttribute<T>
{
T Value { get; }
}
Пример пользовательского атрибута
public sealed class AbbreviationAttribute: Attribute, IAttribute<string>
{
private readonly string value;
public AbbreviationAttribute(string value)
{
this.value = value;
}
public string Value
{
get { return this.value; }
}
}
Метод получения пользовательского атрибута из Enum
public static R GetAttributeValue<T, R>(IConvertible @enum)
{
R attributeValue = default(R);
if (@enum != null)
{
FieldInfo fi = @enum.GetType().GetField(@enum.ToString());
if (fi != null)
{
T[] attributes = fi.GetCustomAttributes(typeof(T), false) as T[];
if (attributes != null && attributes.Length > 0)
{
IAttribute<R> attribute = attributes[0] as IAttribute<R>;
if (attribute != null)
{
attributeValue = attribute.Value;
}
}
}
}
return attributeValue;
}
Пример Enum
Использование этого шаблона
public enum Download
{
[Abbreviation("check")]
[Description("Certified")]
C = 1,
[Abbreviation("no-formal")]
[Description("No formal certification")]
NF = 2,
[Abbreviation("cert-prob")]
[Description("Certified with potential problems")]
CP = 3
}
Оба Abbreviation
и Description
являются пользовательскими атрибутами, реализующими IAttribute<T>
. Мой фактический Enum
имеет 11 возможных значений, и, как я уже упоминал ранее, он используется в 28 отдельных свойствах в моем пользовательском объекте. Использование пользовательских атрибутов казалось лучшим способом сопоставить эту информацию взад и вперед.
Теперь для вопроса, это лучший способ добиться этого? Я храню значение Enum
( "C", "NF" или "CP" в фрагменте выше) в базе данных, но мне нужны значения аббревиатуры и описания в моем коде. Кроме того, я сомневаюсь, что это будет окончательный набор настраиваемых атрибутов, которые мне понадобятся.
Прежде чем я продолжу двигаться вперед с этим шаблоном... это правильный способ сделать что-то? Я предпочел бы исправить потенциальные проблемы с этим подходом сейчас, чем отследить назад и реорганизовать позже.