मैं एक ऐसा एप्लिकेशन बना रहा हूं जो कस्टम डेटा के लिए Enum
एस का भारी उपयोग करता है। अनिवार्य रूप से, किसी ऑब्जेक्ट को डेटाबेस में 28 अलग-अलग विशेषताओं के साथ संग्रहीत किया जाता है। प्रत्येक विशेषता एक दो-वर्ण फ़ील्ड है जिसका अनुवाद एसक्यूएल से सीधे Enum
तक किया जाता है।Enums खतरनाक के लिए कस्टम विशेषताएँ हैं?
दुर्भाग्य से, मुझे इन मानों को दो अलग-अलग मानव-पठनीय मूल्यों में भी अनुवाद करने की आवश्यकता है। एक डेटा टेबल पर एक किंवदंती के लिए, और एक सीएसएस कक्षा के लिए एक वेब अनुप्रयोग फ्रंट एंड पर एक छवि शैली बनाने के लिए।
ऐसा करने के लिए, मैंने दो कस्टम विशेषताओं को स्थापित किया है और उन्हें आवश्यक होने पर 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
मान ("सी", "एनएफ", या "सीपी" ऊपर स्निपेट में) स्टोर करता हूं, लेकिन मुझे अपने कोड में संक्षेप और विवरण के मानों की आवश्यकता है। साथ ही, मुझे संदेह है कि यह कस्टम विशेषताओं का अंतिम सेट होगा जो मुझे चाहिए।
इससे पहले कि मैं इस पैटर्न के साथ आगे बढ़ता हूं ... क्या यह चीजों को करने का सही तरीका है? मैं बाद में ट्रैक और रिफैक्टर को ट्रैक करने के बजाय अब इस दृष्टिकोण के साथ संभावित समस्याओं को ठीक करना चाहता हूं।
मैं कुछ स्थानीयकरण मुद्दों को देख सकता था क्योंकि यह – asawyer
अच्छा बिंदु है। हालांकि, मैं 'gettext' शैली स्थानीयकरण सेटअप का समर्थन करने के लिए शायद 'IAttribute' को संशोधित कर सकता हूं। मैं स्केलेबिलिटी, प्रदर्शन और सर्वोत्तम प्रथाओं के बारे में अधिक चिंतित हूं जिनके बारे में मुझे पता नहीं हो सकता है। – EAMann
'GetAttributeValue' पिछले विवरण टेक्स्ट के विपरीत एक एक्सटेंशन विधि नहीं है। –