هذه المقالة متوفرة أيضا باللغة العربية، اقرأها هنا.
المحتويات
محتويات هذا الموضوع:
- المحتويات
- نظرة خاطفة
- مقدمة
- الخلفية
- مقتطفات من الكود
- التحميل
نظرة خاطفة
اليوم معنا مثال يوضح فكرة الانعكاس Reflection في بيئة الدوت نت وكيفية الاستفادة منها. سنتعلم العديد من الأفكار حول موضوع الانعكاس، وسنستعرض هذا الدرس في خلال نقاط نتمنى أن تكون ممتعة وشيقة لكم بإذن الله تعالى.
اليوم لا نتكلم عن الانعكاس Reflection أو نقوم بشرحه، ولكن اليوم نوضح مثال على هذه التقنية ونرجئ الشرح إلى دروس قادمة بإذن الله تعالى.
سوف نقوم بعرض المثال في أفكار ونقاط بسيطة وسهلة، وسنستعرض بعض الأجزاء من الكود، وما تحتاجه لفهم هذا الكود.
المثال تم تطويره بـ VB.NET وتقنية WinForms.
مقدمة
معنا اليوم برنامج AssemblySpy، أداة بسيطة توضح فكرة الانعكاس Reflection في بيئة الدوت نت وهي فكرة استعراض مكونات الـ Assembly (سواء تطبيقات أو مكاتب) برمجيا، وتشمل عرض التصنيفات Classes، التركيبات Structures، الأعضاء Members (الدوال والخصائص ونحوها)، وغيرها من المكونات المعروفة التي تقوم بإنشائها في برنامجك أو مكتبتك.
المثال تم تطويره باستخدام VB.NET و WinForms. الشكل التالي شكل 1 يوضح شاشة البرنامج أثناء استعراض مكونات المكتبة الرئيسية في بيئة الدوت نت والتي لا يستغني عنها أي برنامج مهما كان وهي mscorlib.dll.
الخلفية
أولا، نأخذ مراجعة بسيطة على عملية الانعكاس Reflection والأدوات التي تحتاج إليها لتطبيقها في بيئة الدوت نت.
- الانعكاس Reflection هي أحد خدمات CLR (القاعدة الرئيسية التي تقوم عليها بيئة الدوت نت) المذهلة والتي تستخدم للحصول على معلومات عن العناصر والمكونات الخاصة بالـ Assembly.
- في الغالب تستخدم خدمة الانعكاس Reflection لتطوير نظام للإضافات Add-ons (أو Plugins) والتي تعطي برنامجك قدرة على قراءة الـ Assembly الخاصة بالإضافة ودمجها في النظام الرئيسي.
- جميع الأنواع Types تنحدر -بطريقة مباشرة أو غير مباشرة- من العنصر الرئيسي وهو System.Type والذي ينحدر بدوره من System.Object. ولهذا يمكننا استخدام العنصر System.Type لتمثيل كافة الأنواع الأخرى. ويشمل هذا العنصر دوال تقوم بتسهيل عملية الانعكاس Reflection.
- جميع العناصر التي نحتاجها في عملية الـ Reflection موجودة في الـ Namespace المسمى System.Reflection وهو موجود في المكتبة mscorlib.dll وهي موجودة في جميع برامج الدوت نت فلا تحتاج لإضافتها.
- تمثل العناصر الداخلية للـ Assembly عند عمل عملية الانعكاس عليها بعناصر منحدرة من الأب System.Reflection.MemberInfo.
- أقوى مثال على خدمة الانعكاس Reflection هو شاشة Object Browser الموجودة في الفيجوال ستوديو Visual Studio.
مقتطفات من الكود
الكود معنا بسيط جدا. الفكرة هي: عند طلب المستخدم لفتح Assembly عن طريق أمر الفتح Open يقوم البرنامج بتحميل هذه الأسمبلي في الذاكرة والبدأ في قراءتها عن طريق استخدام دوال الـ Reflection. أولا، يقوم البرنامج بتحميل كافة الأنواع Types الموجودة في هذه الأسمبلي وإضافتها إلى القائمة اليسرى والانتظار حتى يقوم المستخدم بتحديد أحد الأنواع حتى يقوم بعرض الأعضاء Members الموجودين فيها في القائمة الشجرية اليمنى.
نقوم بتحميل الأسمبلي في الذاكرة عن طريق الدالة System.Reflection.LoadFrom() فنحصل على مصفوفة من نوع System.Type تحوي الأنواع الموجودة في هذه الأسمبلي.
باستخدام الدالة System.Type.GetXXX() يمكننا الحصول على أي من أعضاء هذا النوع والتي تكون عبارة عن أحد العناصر المنحدرة من System.Reflection.MemberInfo. لاحظ هذا التدرج شكل 2.
نقوم بعرض الأعضاء للنوع المحدد في القائمة اليمنى والتي نقسمها حسب نوع العضو إلى:
- Static Fields:
المتغيرات التي لها المعرف Shared. نحصل عليها باستخدام الدالة System.Type.GetFields(). - Static Properties:
الخصائص التي لها المعرف Shared. نحصل عليها باستخدام الدالة System.Type.GetProperties(). - Static Events:
الأحداث التي لها المعرف Shared. نحصل عليها باستخدام الدالة System.Type.GetEvents() . - Static Methods:
الدوال التي لها المعرف Shared. نحصل عليها باستخدام الدالة System.Type.GetMethods(). - Static Constructors:
الـ Constructors التي لها المعرف Shared. نحصل عليها باستخدام الدالة System.Type.GetContructors(). - Instance Fields:
المتغيرات الخاصة بالنوع. نحصل عليها باستخدام الدالة System.Type.GetFields() مع تحديد الخيار BindingFlags.Instance. - Instance Properties:
الخصائص الخاصة بالنوع. نحصل عليها باستخدام الدالة System.Type. GetProperties() مع تحديد الخيار BindingFlags.Instance. - Instance Events:
الأحداث الخاصة بالنوع. نحصل عليها باستخدام الدالة System.Type.GetEvents() مع تحديد الخيار BindingFlags.Instance. - Instance Methods:
الدوال الخاصة بالنوع. نحصل عليها باستخدام الدالة System.Type.GetMethods() مع تحديد الخيار BindingFlags.Instance. - Instance Constructors:
الـ Constructors الخاصة بالنوع. نحصل عليها باستخدام الدالة System.Type.GetConstructors() مع تحديد الخيار BindingFlags.Instance.
التحميل
قم بتحميل المثال من هنا.
خاتمة
إذا كانت هناك أي أسئلة أو استفسارات يرجى مشاركتكم بها معنا.