לפני כמה חודשים, עבדתי על שדרוג ה-LMS. יצרתי Enum חדש ב-LMS, המתאר שלושה סוגי פרסום פתרון למטלה.
public enum eSolveDateType{ByDate = 0,Immediate = 1,ByTeacherPermission = 2};
פעמים רבות הייתי צריכה לכתוב ב-UI את סוג פרסום הפתרון בעברית. כלומר, ByDate
היה צריך להיות מתורגם ל-“לפי תאריך”, Immediate
ל-“עם הגשת המטלה”, ו-ByTeacherPermission
מתורגם ל-“לפי אישור מורה”.
כידוע, כדי לכתוב בעברית בכליקיט אנו משתמשים בקובץ XML, ולכל ביטוי בעברית שאנו רוצים להשתמש בו, אנו מגדירים קוד בקובץ השפות. למשל כך:
<msgcode="nByTeacherPermission>לפי אישור מורה</msg> <msgcode="nImmediate">עם הגשת המטלה</msg> <msgcode="nAtDate">בתאריך</msg>
אבל אני, בגלל איזו סתימה במוח שלי, לא הצלחתי אף פעם לזכור את הקוד לכל סוג פרסום פתרון בקובץ השפות. אז כל פעם שהייתי צריכה לכתוב ל-UI, הייתי רצה לקובץ שפות, מחפשת את הקוד שאני צריכה, ומעתיקה…
בלי ספק, יעילות בהתגלמותה.
באותה תקופה, נתקלתי במאמר הזה ב- CodeProject.
המאמר מתאר איך אפשר להוסיף attribute לפריטים של Enum (אטריביוט זה סוגריים מרובעים שנמצאים מעל לשם של פריט). הוא גם נותן מתודה קצרצה שמביאה את אותו אטריביוט:
public string GetEnumDescription(Enum value) { System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString()); System.ComponentModel.DescriptionAttribute[] attributes = (System.ComponentModel.DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); return (attributes.Length > 0) ? attributes[0].Description : value.ToString(); }
ואז חשבתי לעצמי: זה יכול לפתור לי את הבעיה!
שמתי בתור attribute
של כל פריט את הקוד שלו בקובץ השפות:
publicenumeSolveDateType { [Description("nAtDate")] ByDate = 0, [Description("nImmediate")] Immediate = 1, [Description("nByTeacherPermission")] ByTeacherPermission = 2 };
ומאז, כשאני קוראת למתודה UI.cUIText
, במקום לתת לה בתור פרמטר את הקוד שאני מעתיקה מקובץ השפות,אני קוראת למתודה שמביאה את האטריביוט, ואת ה-output שלה אני מעירה בתור פרמטר ל-UI.cUIText
.
UI.cUIText(GetEnumDescription(eSolveDateType.ByDate));