Sto costruendo un'applicazione che fa un uso pesante di Enum
s per dati personalizzati. Essenzialmente, un oggetto è memorizzato nel database con circa 28 attributi separati. Ogni attributo è un campo di due caratteri che viene tradotto dall'SQL direttamente su Enum
.Gli attributi personalizzati per Enum sono pericolosi?
Purtroppo, ho anche bisogno di tradurre questi valori in due valori diversi leggibili dall'uomo. Uno per una legenda su una tabella di dati e uno per una classe CSS per lo stile di un'immagine sul front-end dell'applicazione Web.
Per fare ciò, ho impostato due attributi personalizzati e li ho applicati allo Enum
se necessario. Ad esempio:
Abilità personalizzata interfaccia
public interface IAttribute<T>
{
T Value { get; }
}
Esempio attributo personalizzato
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; }
}
}
metodo per recuperare attributi personalizzati da 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;
}
Esempio Enum
Uso Questo modello
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
}
Sia Abbreviation
e Description
sono attributi personalizzati che implementano IAttribute<T>
. Il mio attuale Enum
ha 11 valori possibili, e come ho detto prima è usato in 28 proprietà separate nel mio oggetto personalizzato. L'utilizzo di attributi personalizzati è sembrato il modo migliore per mappare queste informazioni avanti e indietro.
Ora per la domanda, è questo il modo migliore per realizzare questo? Memorizzo il valore Enum
("C", "NF" o "CP" nello snippet in alto) nel database, ma ho bisogno dei valori dell'abbreviazione e della descrizione nel mio codice. Inoltre, dubito che questo sarà il set finale di attributi personalizzati di cui ho bisogno.
Prima di continuare ad andare avanti con questo schema ... è il modo giusto di fare le cose? Mi piacerebbe piuttosto risolvere potenziali problemi con questo approccio ora di dover rintracciare e refactoring in seguito.
Potrei vedere alcuni problemi di localizzazione così com'è – asawyer
Buon punto. Potrei probabilmente modificare 'IAttribute' per supportare un setup di localizzazione in stile' gettext', comunque. Sono più preoccupato per la scalabilità, le prestazioni e le migliori pratiche di cui potrei non essere a conoscenza. – EAMann
'GetAttributeValue' non è un metodo di estensione contrario al testo della descrizione precedente. –