Я создаю приложение, которое интенсивно использует Enum
s для пользовательских данных. По сути, объект хранится в базе данных с около 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" в фрагменте выше) в базы данных, но мне нужны значения аббревиатуры и описания в моем коде. Кроме того, я сомневаюсь, что это будет последний набор пользовательских атрибутов, которые мне понадобятся.
Прежде чем я продолжу двигаться вперед с этим шаблоном ... это правильный способ сделать что-то? Я бы предпочел исправить потенциальные проблемы с этим подходом сейчас, чем потом отслеживать и реорганизовывать позже. 1047 *