2. Outlines
مقدمة إلى الإنعكاس.
ماهو الانعكاس ؟
ما هو التحميل الديناميكي ؟
التحقق من احتواء صف ما على منهج معين .
تحديد فيما إذا كان صف ما مشتق من آخر
05 2 تشرين الثاني، 14
3. مقدمة إلى الانعكاس
يرتبط موضوع الانعكاس بالمجمعات والصفات بشكل مباشر.
عملية استكشاف المجمعة للحصول على محتوياتها بشكل كامل
عملية تشريح التطبيقات )التعرف على كامل محتوياتها في زمن التنفيذ(.
يدور موضوع هذا الدرس حول البيانات الوصفية أو معرف البيانات
وطرق استرجاعه . “metadata”
05 3 تشرين الثاني، 14
4. ماهو الانعكاس ؟
عملية استكشاف داخلية لتطبيق ما دون الولوج إلى شيفرته .
ما بالإضافة إلى جميع )Assembly( إيجاد جميع الصفوف في تجُّمع
داخل صف ما إنطلاق ا Events وال Properties وال methods ال
interfaces من الصف الأساس الذي اشتقُّ منه هذا الصنف وانتها ء بال
التي يحققها .
إنشاء أغراض واستدعاء مناهجها أثناء زمن التنفيذ.
فمثلاً : يمكنك استخدام الانعكاس للتحقق من وجود صفوف معينة في
فهرسك )مجلدك(الرئيسي وأنْ وجدت , تقوم بتحميلها واستخدامها
ضمن التطبيق الخاص بك .
05 4 تشرين الثاني، 14
5. ماهو الانعكاس ؟
التي DLL يُعتبر الانعكاس بمثابة مفهوم مكتبات الربط الديناميكي
وجِدَت خصيصا لمعرفة محتوياتها أثناء زمن التنفيذ.
عن تابع DLL لم نكن نستطيع البحث ضمن ملف COM سابقا في
معين وإذا استطعنا ذلك فلن نستطيع معرفة ما هي البارمترات
يمكن ذلك باستخدام الانعكاس .NET المقدمة للتابع , لكن مع
بالإضافة إلى البيانات الوصفية .
05 5 تشرين الثاني، 14
6. لماذا نحتاج إلى الانعكاس؟
الانعكاس ضروري في أي لغة تفسيرية.
يجب أن يعرف ما يقوم بتحميله CLR
namespace Attributes_Reflection
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World");
}
}
}
05 6 تشرين الثاني، 14
7. ما هو التحميل الديناميكي ؟
أبسط مثال هو تحميل مجمعة أثناء زمن التنفيذ.
using System.Reflection;
من المكتبة Assembly يمكن تحميل أي مجمعة وذلك بواسطة الصف
كمايلي : LoadFrom وباستخدام التابع الستاتيكي Reflection
Assembly a = Assembly.LoadFrom(@"D:atom.dll");
الآن يمكن استخراج كافة الأنماط ضمن المجمعة التي قمنا بتحميلها وذلك
حيث يعيد ها المنهج مصفوفة كائنات من GetTypes يتم بواسطة التابع
التي تتضمن معلومات عن الأنواع المختلفة المُعرفة ضمن Type الصف
هذه المجمعة
Type[] types=a.GetTypes();//Get an All Types in the
Assembly
05 7 تشرين الثاني، 14
8. ما هو التحميل الديناميكي ؟
عن ماذا يمثل؟ Type الآن نقوم بسؤال الكائن
) class, enum ,interface ,ValueType (
Property
Description
Class يكون هذا النوع هو true إذا كانت هذه الخاصية isClass
Enum يكون هذا النوع هو true إذا كانت هذه الخاصية isEnum
Interface يكون هذا النوع هو true إذا كانت هذه الخاصية isInterface
ValueType يكون هذا النوع هو true إذا كانت هذه الخاصية isValueType
05 8 تشرين الثاني، 14
9. ما هو التحميل الديناميكي ؟
. IsNotPublic و IsPublic : هما (Access Modifier) خاصيتين لتحيد نطاق الولوج
Assembly a = Assembly.GetExecutingAssembly(); //Get the
Current Assembly
Type[] types = a.GetTypes(); // Get an All Types in the
Current Assembly
foreach(Type t in types)
{
if (t.IsPublic)
Console.WriteLine("Class {0} is Public", t.FullName);
}
05 9 تشرين الثاني، 14
10. ما هو التحميل الديناميكي ؟
. Type المناهج الخاصة بالصنف
Description method اسم المنهج
)Assembly استرجاع كافة الأنواع لتجمع مُعطى )خاص بالصف GetTypes
صف ما مُعطى )method( استرجاع كافة مناهج GetMethods
استرجاع كافة بواني صف ما مُعطى GetConstructors
استرجاع كافة خصائص صف ما مُعطى GetProperties
استرجاع كافة أحداث صف ما مُعطى GetEvents
استرجاع كافة الواجهات التي يحققها صف ما مُعطى. GetInterfaes
05 10 تشرين الثاني، 14
11. التحقق من احتواء صف ما على منهج معين .
static void Main(string[] args)
{
string methodName="DoItAll"; //
// if you Want to search in A Specific Assembly you must be Call
// Assembly.LoadFrom(path of Assembly)
Assembly a = Assembly.GetExecutingAssembly();
foreach (Type type in a.GetTypes())
{
// Is this a Class ?
if (type.IsClass == false)
continue;// No, Skip it
//Get All Methods in Class
foreach (MethodInfo m in type.GetMethods())
{
if (m.Name== methodName)
Console.WriteLine("Class {0} Contains method {1}"
,type.FullName, m.Name);
}
}
}
05 11 تشرين الثاني، 14
13. تحديد فيما إذا كان صف ما مشتق من آخر
class A:B
{
}
class B:C
{
}
class C
{
}
C
B
A
05 13 تشرين الثاني، 14
14. تحديد فيما إذا كان صف ما مشتق من آخر
static void Main(string[] args)
{
string classname = "C";
Assembly a = Assembly.GetExecutingAssembly();// if you Want
//to search in A Specific Assembly you must be Call
//Assembly.LoadFrom(path of Assembly)
foreach (Type type in a.GetTypes())
{
// Is this a Class ?
if (type.IsClass == false)
continue; // No, Skip it
//
Type Basetype = type.BaseType;
while (Basetype != null)
{
if (Basetype.FullName.EndsWith(classname))
Console.WriteLine("Class {0} is derived
from{1}",type.FullName, classname);
Basetype = Basetype.BaseType;
}
}
}
05 14 تشرين الثاني، 14