我正在構建一個應用程序,可以大量使用Enum
來定製數據。本質上,一個對象存儲在數據庫中,大約有28個獨立的屬性。每個屬性都是從SQL直接轉換爲Enum
的雙字符字段。Enums的自定義屬性是否危險?
不幸的是,我還需要將這些值轉換成兩個不同的人類可讀值。一個用於數據表上的圖例,另一個用於CSS類來在Web應用程序前端設計圖像。
爲此,我設置了兩個自定義屬性,並在必要時將它們應用於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」),但我需要我的代碼中的縮寫和說明的值。另外,我懷疑這將是我需要的最後一組自定義屬性。
在我繼續前進這種模式之前...... 是否是正確的做事方式?我寧願現在用這種方法解決潛在的問題,而不是必須稍後跟蹤和重構。
我可以看到一些本地化問題 – asawyer 2012-03-07 16:45:05
好點。不過,我可能會修改'IAttribute'來支持gettext風格的本地化設置。我更關心我可能不知道的可伸縮性,性能和最佳實踐。 – EAMann 2012-03-07 16:48:11
'GetAttributeValue'不是與前面的描述文字相反的擴展方法。 – 2012-03-07 16:57:27