Estoy construyendo una aplicación que hace un uso intensivo de Enum
s para datos personalizados. Esencialmente, un objeto se almacena en la base de datos con aproximadamente 28 atributos separados. Cada atributo es un campo de dos caracteres que se traduce del SQL directamente a Enum
.¿Son los atributos personalizados para los Enum peligrosos?
Desafortunadamente, también necesito traducir estos valores en dos valores diferentes legibles por humanos. Uno para una leyenda en una tabla de datos, y otro para una clase de CSS para darle estilo a una imagen en el front-end de la aplicación web.
Para hacer esto, he configurado dos atributos personalizados y los he aplicado al Enum
cuando es necesario. Por ejemplo: Atributo
Interface atributo personalizado
public interface IAttribute<T>
{
T Value { get; }
}
Ejemplo Custom
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; }
}
}
método para recuperar atributo personalizado de 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;
}
Ejemplo Enum
el uso de este modelo de
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
}
Tanto Abbreviation
y Description
son atributos personalizados que implementan IAttribute<T>
. Mi actual Enum
tiene 11 valores posibles, y como mencioné antes, se usa en 28 propiedades separadas en mi objeto personalizado. El uso de atributos personalizados parecía ser la mejor forma de mapear esta información de ida y vuelta.
Ahora, para la pregunta, ¿es esta la mejor manera de lograr esto? Guardo el valor Enum
("C", "NF" o "CP" en el fragmento de arriba) en la base de datos, pero necesito los valores de la abreviatura y descripción en mi código. Además, dudo que este sea el conjunto final de atributos personalizados que necesitaré.
Antes de seguir avanzando con este patrón ... ¿es la manera correcta de hacer las cosas? Prefiero solucionar problemas potenciales con este enfoque ahora que tener que rastrear y refactorizar más tarde.
Pude ver algunos problemas de localización tal como está – asawyer
Buen punto. Sin embargo, probablemente podría modificar 'IAttribute' para soportar una configuración de localización de estilo' gettext'. Estoy más preocupado por la escalabilidad, el rendimiento y las mejores prácticas de las que podría no estar al tanto. – EAMann
'GetAttributeValue' no es un método de extensión contrario al texto de descripción anterior. –