التأمل والاستبطان في C#: كيف تنظر داخل الكود الخاص بك

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: سحر الانعكاس

تخيل أنك تكتب كودًا يمكنه "النظر" إلى نفسه. ليس كما في المرآة المعوجة، بل كما في جهاز الأشعة السينية - لرؤية البنية، الخصائص، الدوال، وحتى تشغيلها دون معرفة اسم الفئة في مرحلة التجميع. هذا ليس سحرًا، بل هو التأمل في C# (الانعكاس) و"أخته الصغرى" - الاستبطان في C#.



لماذا نحتاج هذا؟ تخيل أنك تكتب نظام إضافات (plugins)، أو أداة لإلغاء تسلسل JSON، أو استدعاء ديناميكي للدوال. بدون التأمل، سيتعين عليك كتابة الكثير من if-else. ولكن معه - يكفي بضعة أسطر. يبدو مثيرًا للاهتمام؟ لنبدأ في الفهم.



في هذه المقالة، لن نمر فقط على النظريات. سنكتب أمثلة كود حقيقية يمكن استخدامها فورًا في المشاريع. ستتعلم كيفية الحصول على معلومات عن أي نوع، إنشاء كائن "من العدم"، استدعاء دالة خاصة، وحتى قراءة السمات. وكل هذا - بلغة C# التي يحبها الكثيرون لقوتها وصرامتها.



ما هو التأمل والاستبطان في C#؟ الفرق بين المفهومين

غالبًا ما تُستخدم هذه المصطلحات كمرادفات، ولكن بينهما خط رفيع:

  • الاستبطان في C# - هو قدرة البرنامج على مراقبة هيكله. يمكنك معرفة الحقول التي تحتويها الفئة، والدوال التي تحتويها، والسمات المرفقة بها. لكنك لا تغير شيئًا.
  • التأمل في C# - هو مفهوم أوسع. يشمل الاستبطان، بالإضافة إلى القدرة على التفاعل مع الكود: استدعاء الدوال، إنشاء الكائنات، تغيير قيم الحقول.

ببساطة: الاستبطان هو "انظر"، التأمل هو "انظر وتفاعل". في C#، كلا الوظيفتين تداران بواسطة مساحة الأسماء System.Reflection. هذه هي أداتك الرئيسية.



مثال عملي: الحصول على معلومات عن النوع (Type)

كل شيء يبدأ من الفئة Type. هذا هو أساس التأمل. يمكن الحصول عليها بثلاث طرق:

// الطريقة 1: عبر typeof()Type typeFromKeyword = typeof(string);

// الطريقة 2: عبر مثيل .GetType()string example = "مرحبًا بالعالم!";Type typeFromInstance = example.GetType();

// الطريقة 3: عبر التجميعة (Assembly)Type typeFromAssembly = Assembly.GetExecutingAssembly().GetType("System.String");


الآن، بوجود كائن Type، يمكننا معرفة كل شيء عن الفئة. لنكتب دالة مفيدة للاستبطان:



using System;using System.Reflection;

public class Inspector{ public static void ShowTypeInfo(Type type) { Console.WriteLine($"=== معلومات عن النوع: {type.Name} ==="); Console.WriteLine($"الاسم الكامل: {type.FullName}"); Console.WriteLine($"هل هو فئة؟ {type.IsClass}"); Console.WriteLine($"هل هو مجرد؟ {type.IsAbstract}"); Console.WriteLine($"الفئة الأساسية: {type.BaseType?.Name}"); Console.WriteLine("الخصائص العامة:"); foreach (PropertyInfo prop in type.GetProperties()) { Console.WriteLine($" - {prop.PropertyType.Name} {prop.Name}"); } Console.WriteLine("الدوال العامة:"); foreach (MethodInfo method in type.GetMethods()) { Console.WriteLine($" - {method.ReturnType.Name} {method.Name}({string.Join(", ", method.GetParameters().Select(p => $"{p.ParameterType.Name} {p.Name}"))})"); } }}

// الاستخدامInspector.ShowTypeInfo(typeof(List<int>));/* الإخراج:=== معلومات عن النوع: List`1 ===الاسم الكامل: System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]هل هو فئة؟ Trueهل هو مجرد؟ Falseالفئة الأساسية: Object

الخصائص العامة: - Int32 Capacity - Int32 Count

الدوال العامة: - Void Add(Int32 obj) - Void Clear() - Boolean Contains(Int32 item) ... والعديد غيرها*/


هذا هو الاستبطان الخالص

المدونات

توصيات الكتب