اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
سه دقیقه
اگر با نوع داده Enum آشنایی ندارید قسمت یکم این مطلب را بخوانید.
با در نظر گرفتن مثال قبل، یک Custom Attribute به نوع داده شمارشی اضافه میکنیم. برای این منظور بصورت زیر عمل میکنیم.
public enum Grade { Failing = 5, BelowAverage = 10, Average = BelowAverage + 5, // = 15 VeryGood = 18, Excellent = 20 }
بازنویسی متد ()ToString:
امکان بازنویسی متد ()ToString در نوع Enum وجود ندارد. بنابراین برای چاپ عبارت Very Good به جای VeryGood تکنیک زیر جالب به نظر میرسد. هر چند استفاده از آرایه و ترکیب اندیس آن با Enum و یا استفاده از HashTable راه هایی است که در ابتدا به ذهن ما خطور میکند اما لطفاً به ادامه مطلب توجه فرمایید!با در نظر گرفتن مثال قبل، یک Custom Attribute به نوع داده شمارشی اضافه میکنیم. برای این منظور بصورت زیر عمل میکنیم.
1. ایجاد کلاس Description که از کلاس Attribute مشتق شده است و تعریف خصوصیت Text:
class Description : Attribute { public string Text; public Description(string text) { Text = text; } }
2. به سراغ نوع Enum تعریف شده رفته و جهت استفاده از صفت جدید که در مرحله قبل پیاده سازی کردیم، تغییرات را به شکل زیر اعمال میکنیم:
public enum Grade { [Description("Mardood")] Failing = 5, [Description("Ajab Shansi")] BelowAverage = 10, [Description("Bad Nabood")] Average = BelowAverage + 5, [Description("Khoob Bood")] VeryGood = 18, [Description("Gol Kashti")] Excellent = 20 }
تنها کاری که باقی مانده یاری گرفتن از متدهای الحاقی (Extension Methods) جهت خواندن مقدار Description است:
public static class ExtensionMethodCls { public static string GetDescription(this Enum enu) { Type type = enu.GetType(); MemberInfo[] memInfo = type.GetMember(enu.ToString()); if (memInfo != null && memInfo.Length > 0) { object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false); if (attrs != null && attrs.Length > 0) return ((Description)attrs[0]).Text; } return enu.ToString(); } }
حال نوع Enum ما کمی توسعه یافته است و توسط متد GetDescription می توان متن دلخواه و متناسب با مقدار را نمایش داد:
Console.WriteLine(grade.GetDescription()); // Print Bad Nabood
کد کامل مثال بررسی شده نیز بصورت زیر خواهد بود:
using System; using System.Reflection; namespace CSharpEnum { class Description : Attribute { public string Text; public Description(string text) { Text = text; } } public enum Grade { [Description("Mardood")] Failing = 5, [Description("Ajab Shansi")] BelowAverage = 10, [Description("Bad Nabood")] Average = BelowAverage + 5, [Description("Khoob Bood")] VeryGood = 18, [Description("Gol Kashti")] Excellent = 20 } public static class ExtensionMethodCls { public static string GetDescription(this Enum enu) { Type type = enu.GetType(); MemberInfo[] memInfo = type.GetMember(enu.ToString()); if (memInfo != null && memInfo.Length > 0) { object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false); if (attrs != null && attrs.Length > 0) return ((Description)attrs[0]).Text; } return enu.ToString(); } } class Program { static void Main(string[] args) { const Grade grade = Grade.Average; Console.WriteLine("Underlying type: {0}", Enum.GetUnderlyingType(grade.GetType())); Console.WriteLine("Type Code : {0}", grade.GetTypeCode()); Console.WriteLine("Value : {0}", (int)grade); Console.WriteLine("--------------------------------------"); Console.WriteLine(grade.ToString()); // name of the constant Console.WriteLine(grade.ToString("G")); // name of the constant Console.WriteLine(grade.ToString("F")); // name of the constant Console.WriteLine(grade.ToString("x")); // value is hex Console.WriteLine(grade.ToString("D")); // value in decimal Console.WriteLine("--------------------------------------"); Console.WriteLine(grade.GetDescription()); // Print Bad Nabood Console.ReadKey(); } } }
با استفاده از این تکنیک (مخصوصاً ما فارسی زبان ها) به راحتی میتوانیم از مقادیر Enum استفاده بهتری ببریم. برای مثال اگر بخواهیم یک مقدار Enum را بصورت فارسی در یک Drop Down List نمایش دهیم این تکنیک بسیار مفید خواهد بود.