आप गणन व्याख्या और फिर प्रतिबिंब का उपयोग शब्दकोश का निर्माण करने के लिए विशेषताओं का उपयोग कर सकते हैं।
[AttributeUsage(AttributeTargets.Field)]
sealed class TemplateAttribute : Attribute {
public TemplateAttribute(String fileName) {
FileName = fileName;
}
public String FileName { get; set; }
}
enum EmailTemplate {
[Template("File1.htm")]
WelcomeEmail,
[Template("File2.htm")]
ConfirmEmail
}
class KnownTemplates {
static Dictionary<EmailTemplate, String> knownTemplates;
static KnownTemplates() {
knownTemplates = typeof(EmailTemplates)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(fieldInfo => Attribute.IsDefined(fieldInfo, typeof(TemplateAttribute)))
.Select(
fieldInfo => new {
Value = (EmailTemplate) fieldInfo.GetValue(null),
Template = (TemplateAttribute) Attribute
.GetCustomAttribute(fieldInfo, typeof(TemplateAttribute))
}
)
.ToDictionary(x => x.Value, x => x.Template.FileName);
}
}
आप इस एक बहुत करते हैं आप एक अधिक सामान्य सामान्य समारोह है कि कि गणन मूल्य के साथ जुड़े एक विशेषता के साथ गणना मूल्यों को जोड़ती है बना सकते हैं:
static IEnumerable<Tuple<TEnum, TAttribute>> GetEnumAttributes<TEnum, TAttribute>()
where TEnum : struct
where TAttribute : Attribute {
return typeof(TEnum)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(fieldInfo => Attribute.IsDefined(fieldInfo, typeof(TAttribute)))
.Select(
fieldInfo => Tuple.Create(
(TEnum) fieldInfo.GetValue(null),
(TAttribute) Attribute.GetCustomAttribute(fieldInfo, typeof(TAttribute))
)
);
}
और इस तरह इसका इस्तेमाल:
knownTemplates = GetEnumAttributes<EmailTemplate, TemplateAttribute>()
.ToDictionary(tuple => tuple.Item1, tuple => tuple.Item2.FileName);
और भी मजेदार के लिए आप एक विस्तार विधि बना सकते हैं:
static class EmailTemplateExtensions {
static Dictionary<EmailTemplate, String> templates;
static EmailTemplateExtensions() {
templates = GetEnumAttributes<EmailTemplate, TemplateAttribute>()
.ToDictionary(tuple => tuple.Item1, tuple => tuple.Item2.FileName);
}
public static String FileName(this EmailTemplate emailTemplate) {
String fileName;
if (templates.TryGetValue(emailTemplate, out fileName))
return fileName;
throw new ArgumentException(
String.Format("No template defined for EmailTemplate.{0}.", emailTemplate)
);
}
}
फिर EmailTemplate.ConfirmEmail.FileName()
पर कॉल करने से File2.htm
वापस आ जाएगा।
स्रोत
2012-04-24 23:58:03
मुझे लगता है कि वे 'स्ट्रिंग sFile = ईमेल टेम्पलेट। कॉन्फर्म। टेम्पलेटफाइल' जैसे वाक्यविन्यास के साथ कक्षा के उपयोग को हटाना चाहते हैं। – AMissico
मार्टिन! धन्यवाद! गुण मेरी अधिकांश स्थितियों (जहां एक स्ट्रिंग उचित है) के लिए एक अच्छा समाधान है। मुझे पता है कि मेरे पास ऐसे मामले हैं जहां प्रत्येक enum में एक जटिल वस्तु मैप की जाती है, लेकिन यह कुछ स्केलर भी कवर कर सकती है। – shannon
यह और अधिक भयानक हो जाता है जितना मैं इसका उपयोग करता हूं। फिर मार्टिन धन्यवाद। – shannon