Buduję aplikację, która intensywnie korzysta z Enum
s dla niestandardowych danych. Zasadniczo obiekt jest przechowywany w bazie danych z około 28 oddzielnymi atrybutami. Każdy atrybut jest dwuliterowym polem, które jest tłumaczone z SQL bezpośrednio na Enum
.Czy niestandardowe atrybuty dla materiałów niebezpiecznych są niebezpieczne?
Niestety, muszę przetłumaczyć te wartości na dwie wartości czytelne dla człowieka. Jedna dla legendy na tabeli danych, a druga dla klasy CSS do stylizowania obrazu w interfejsie aplikacji WWW.
Aby to zrobić, skonfigurowałem dwa niestandardowe atrybuty i zastosowałem je w razie potrzeby do Enum
. Np
interfejs klienta Atrybut
public interface IAttribute<T>
{
T Value { get; }
}
Przykład klienta Atrybut
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; }
}
}
metoda pobiera zwykły atrybut z 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;
}
Przykład Enum
Stosując ten wzór
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
}
Zarówno Abbreviation
i Description
są niestandardowych cech, które implementują IAttribute<T>
. Moje rzeczywiste Enum
ma 11 możliwych wartości, i jak już wspomniałem wcześniej jest używany w 28 oddzielnych właściwości w moim niestandardowym obiekcie. Używanie atrybutów niestandardowych wydawało się najlepszym sposobem na odwzorowanie tych informacji w jedną i drugą stronę.
Teraz na pytanie, jest to najlepszy sposób, aby to osiągnąć? Przechowuję wartość Enum
("C", "NF" lub "CP" we fragmencie powyżej) w bazie danych, ale potrzebuję wartości Skrót i Opis w moim kodzie. Ponadto wątpię, aby to był ostateczny zestaw niestandardowych atrybutów, których potrzebuję.
Zanim przejdę do przodu z tym wzorem ... czy to właściwy sposób na robienie rzeczy? Wolę teraz rozwiązać potencjalne problemy związane z tym podejściem niż później.
Mogłem zobaczyć pewne problemy z lokalizacją w stanie, w jakim się znajduje – asawyer
Dobra uwaga. Prawdopodobnie mógłbym zmodyfikować 'IAttribute', aby obsługiwał konfigurację lokalizacji w stylu' gettext'. Bardziej niepokoję się skalowalnością, wydajnością i najlepszymi praktykami, których być może nie jestem świadomy. – EAMann
'GetAttributeValue' nie jest metodą rozszerzenia w przeciwieństwie do poprzedniego tekstu opisu. –