אדר (6)

Attributes in Enums

 

לפני כמה חודשים, עבדתי על שדרוג ה-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 &gt; 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));

 

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.