ראינו בעבר (טיפ מספר 22) כיצד אנחנו יכולים לבדוק שיש לEnum איזשהו Flag.
הדרך הייתה כזו:
|
|
הבעיה היא שלא כל כך כיף לכתוב את זה.
עכשיו, אחרי שלמדנו על Extension Methods נוכל לעשות משהו עם Syntax טיפה יותר יפה:
ניצור Extension Method כזה:
|
|
ואז נוכל לכתוב קוד כזה:
|
|
שימו לב שהסינטקס יותר יפה, אבל יש פה מספר בעיות:
- יש Boxing לEnum בקריאה לפונקציה
- אנחנו ממירים את הערכים לulong
- אין לנו התחייבות ששני הEnumים מאותו סוג
בקשר לבעיה האחרונה, ניתן לפתור אותה בזמן ריצה ע"י בדיקה שהEnumים מאותו סוג. שתי הבעיות הראשונות הן בעייתיות מבחינת ביצועים.
אגב, בFramework 4.0 הוסיפו מתודה לEnum שנקראת HasFlag אשר בודקת אם יש לEnum דגל. המימוש הוא מאוד דומה למה שכתבנו פה.
בכל מקרה זה בעיקר נחמד.
הערה:
ניתן לעשות כך :
|
|
כך בעצם נחסוך כמה דברים :
- גנריות – נוכל להשתמש בפונקציה הנ"ל על כל דבר שמממש IConvertible – אפילו Stringים מממשים את זה, וכל הPrimitives.
- אין Boxing
- יש התחיבות ששני הEnumים הם מאותו הסוג.