מאפיינים ורפלקציה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 44 מתוך 70.
מאפיינים הם תגיות מטא־נתונים שמצמידים לרכיבי קוד כמו מחלקות, מתודות או מאפיינים. הם לא משנים ישירות את אופן הביצוע של הקוד, אבל מספקים מידע שאפשר לקרוא בזמן ריצה. Reflection הוא המנגנון שקורא את המטא־נתונים האלה.
מחילים מאפיין על ידי הצבתו בסוגריים מרובעים מעל לרכיב היעד:
[Obsolete("Use NewMethod instead")]
public void OldMethod() { }
[Serializable]
public class Person
{
public string Name { get; set; }
}אפשר ליצור מאפיינים מותאמים אישית באמצעות ירושה מ־Attribute:
public class AuthorAttribute : Attribute
{
public string Name { get; }
public AuthorAttribute(string name) => Name = name;
}
[Author("John")]
public class Calculator { }שיקוף מאפשר לך לבדוק טיפוסים ולקרוא מאפיינים בזמן ריצה באמצעות מרחב השמות System.Reflection:
Type type = typeof(Calculator);
var attr = type.GetCustomAttribute<AuthorAttribute>();
Console.WriteLine(attr.Name); // Johnאפשר גם לגלות מתודות ומאפיינים ולהפעיל אותם באופן דינמי:
MethodInfo[] methods = type.GetMethods();
foreach (var method in methods)
Console.WriteLine(method.Name);תכונות והשתקפות עומדות בבסיסם של מסגרות עבודה רבות – ספריות לסריאליזציה משתמשות בהן כדי לשלוט בפלט JSON, מסגרות עבודה לבדיקות משתמשות בהן כדי לגלות מתודות בדיקה, ומכלי הזרקת תלות משתמשים בהן כדי לחבר שירותים באופן אוטומטי.
אתגר
קלבואו נבנה מערכת לגילוי תוספים שמשתמשת במאפיינים מותאמים אישית ובהשתקפות כדי למצוא ולתאר אוטומטית מחלקות המסומנות כתוספים. הדבר דומה לאופן שבו מסגרות עבודה אמיתיות מגלות רכיבים, מתודות בדיקה או נקודות קצה של API בזמן ריצה.
תארגנו את הקוד שלכם בשלושה קבצים:
PluginAttribute.cs: צרו מאפיין מותאם אישית בשםPluginAttributeבמרחב השמותPluginSystem. המאפיין שלכם צריך:- לרשת מ-
Attribute - להכיל שתי תכונות לקריאה בלבד:
Name(מחרוזת) ו-Version(מחרוזת) - לקבל את שני הערכים באמצעות הבנאי שלו
- לרשת מ-
Plugins.cs: צרו כמה מחלקות של תוספים במרחב השמותPluginSystem. חלקן צריכות להיות מעוטרות ב-PluginAttributeשלכם, ואחת לא:ImageProcessor- מסומנת באמצעות[Plugin("Image Processor", "1.0")]DataExporter- מסומנת באמצעות[Plugin("Data Exporter", "2.5")]HelperUtility- לא מסומנת בשום מאפיין (זו פשוט מחלקה רגילה)
Program.cs: בקובץ הראשי שלכם, השתמשו בהשתקפות כדי לגלות את כל המחלקות שיש להן אתPluginAttribute. עבור כל תוסף שיתגלה, הדפיסו את המידע שלו. תצטרכו:- לקבל את כל הטיפוסים מהאסמבלי הנוכחי
- לבדוק כל טיפוס כדי לראות אם יש לו את
PluginAttribute - לחלץ ולהציג את התכונות
Nameו-Versionשל המאפיין
השתמשו ב-System.Reflection כדי לבדוק טיפוסים ולאחזר מאפיינים מותאמים אישית. המתודה GetCustomAttribute<T>() מחזירה את null אם המאפיין אינו קיים, כך שתוכלו להשתמש בכך כדי לסנן את המחלקות שהן תוספים בפועל.
הדפיסו כל תוסף שהתגלה בפורמט הבא, אחד בכל שורה:
Plugin: {Name} (v{Version})יש להדפיס את התוספים לפי הסדר הבא: ImageProcessor תחילה, ואז DataExporter. המחלקה HelperUtility לא אמורה להופיע בפלט, משום שאין לה את המאפיין.
פלט צפוי:
Plugin: Image Processor (v1.0)
Plugin: Data Exporter (v2.5)האתגר הזה מדגים כיצד מסגרות עבודה משתמשות במאפיינים כסמנים ובהשתקפות כדי לגלות אותם - אותה טכניקה עומדת בבסיס מכלי הזרקת תלות, ספריות סריאליזציה ומסגרות בדיקה!
נסו בעצמכם
using System;
using System.Reflection;
using PluginSystem;
class Program
{
public static void Main(string[] args)
{
// TODO: קבל את כל הטיפוסים מהאסמבלי הנוכחי
// רמז: השתמש ב-Assembly.GetExecutingAssembly().GetTypes()
// TODO: עבור על כל טיפוס ובדוק אם יש לו PluginAttribute
// רמז: השתמש ב-type.GetCustomAttribute<PluginAttribute>()
// TODO: אם המאפיין קיים, הדפס את פרטי התוסף בפורמט:
// Plugin: {Name} (v{Version})
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין