כיצד לעבוד עם תכונות ב- C #

תכונות הן תכונה עוצמתית בשפת התכנות C # שיכולה להוסיף מידע מטא-נתונים לאספות שלך.

תכונה היא למעשה אובייקט המשויך לכל אחד מהאלמנטים הללו: הרכבה, מחלקה, שיטה, נציג, Enum, אירוע, שדה, ממשק, נכס ומבנה. בעזרתם ניתן לשייך מידע הצהרתי - ניתן לאחזר מידע כזה בזמן הריצה בנקודת זמן מאוחרת יותר אם יש צורך להשתמש בבבואה. במילים אחרות, אתה יכול להשתמש בתכונות כדי להזרים מידע נוסף למכלולים שניתן לבחון בזמן הריצה במידת הצורך באמצעות השתקפות. מאפיין מורכב משמו ובאופציה, רשימת פרמטרים. שם התכונה תואם למחלקת התכונות.

אתה יכול לנצל את התכונות כדי לאמת את האובייקטים העסקיים ביישום שלך. ישנם שני סוגים של תכונות - תכונות מהותיות ותכונות מותאמות אישית. בעוד שהראשון זמין כחלק ממסגרת .Net, ניתן ליישם את האחרון על ידי הפקת מחלקה מהמחלקה System.Attribute. ה- MSDN קובע: "תכונה היא פיסת מידע הצהרתית נוספת המוגדרת לצורך הצהרה."

בואו ניכנס עכשיו לקוד כלשהו. ניתן להשתמש במאפיין מיושן לציון שיטה מיושנת - כזו שאסור להשתמש בה יותר מכיוון שכבר אין בה צורך או אולי יש לה אלטרנטיבה אחרת. קטע הקוד הבא ממחיש כיצד ניתן להשתמש במאפיין מיושן מעל הצהרת שיטה.

[Obsolete("This method is obsolete...")]

        public static void DoSomeWork()

        {

            //Some code

        }

אם אתה משתמש בשיטה זו בקוד שלך ומחבר את התוכנית שלך, תראה אזהרה בחלון הפלט של Visual Studio IDE. אז אתה יכול להתעלם מאזהרה זו אם תרצה בכך. עכשיו, מה אם אתה רוצה שהמפתחים שלך לא ישתמשו בשיטה זו בכלל? ובכן, לאחר מכן תוכל להשתמש בפרמטר השני (אם כי זה אופציונלי) תוך הכרזת התכונה מיושן. הנה הגרסה המתוקנת של שיטת DoSomeWork (). שימו לב לשימוש בפרמטר הבוליאני הפעם.

[Obsolete("This method is obsolete...", true)]

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

כאשר אתה מעביר הפעם את "true" כפרמטר האופציונלי השני ומרכיב את התוכנית שלך, הקוד כלל לא יתקדר. זה מה שרצית לעשות, לא?

תכונות מותאמות אישית

בחלק זה נחקור כיצד אנו יכולים ליישם תכונות מותאמות אישית. מאפיינים מותאמים אישית הם מחלקות שעוברות בירושה את מחלקת המערכת. לכן, כדי ליישם מחלקת מאפיינים מותאמת אישית, צור מחלקה חדשה והפק אותה ממחלקת מערכת.מאפיין כמוצג להלן.

using System;

public class CustomAttribute : Attribute

{

}

כדי לשלוט על השימוש בתכונות מותאמות אישית, אתה יכול לנצל את המחלקה AttributeUsage. מחלקה זו מכילה מאפיינים כמו, ValidOn, AllowMultiple ו- Inherited, בהם ניתן להשתמש כדי לשלוט על השימוש במאפיין המותאם אישית שלך.

קטע הקוד הבא ממחיש גרסה שונה של מחלקת התכונות המותאמות אישית שלנו. שימו לב לשימוש בבנאי שמקבל מחרוזת כארגומנט ומקצה אותו לחבר המחרוזת הפרטי של הכיתה. זה רק לצורך המחשה בלבד.

[AttributeUsage(AttributeTargets.All)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

אתה יכול גם לציין את יעדי התכונות שעליך להחיל על המאפיין המותאם אישית שלך. כך תוכל לעשות זאת.

[AttributeUsage(AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

כעת תוכל להשתמש בבבואה כדי להציג את כל התכונות המוחלות על אובייקט מסוים באמצעות קטע הקוד הבא.

MemberInfo memberInfo = typeof(CustomAttribute);

object[] attributes = memberInfo.GetCustomAttributes(true);

for (int i = 0, j = attributes.Length; i < j; i++)

  {

     Console.WriteLine(attributes[i]);

  }

כעת שקול את המחלקה הבאה עליה נשתמש במאפיין המותאם אישית שלנו.

[CustomAttribute("Hello World...")]

public class SomeClass

{

}

שימו לב כיצד נעשה שימוש במאפיין המותאם אישית וטקסט הועבר כטענה אליו. קטע הקוד הבא ממחיש כיצד ניתן להדפיס את תוכן מאפיין הטקסט.

MemberInfo memberInfo = typeof(SomeClass);

object[] attributes = memberInfo.GetCustomAttributes(true);

foreach (object attribute in attributes)

{

CustomAttribute customAttribute = attribute as CustomAttribute;

if (customAttribute != null)

Console.WriteLine("Text = {0}", customAttribute.Text);

else

Console.WriteLine();

}