العفو أخي
ay.alhaj
الـ Function ـ
( FindAllChildren )
تستخدم الـ Attribute
<Runtime.CompilerServices.Extension()>
ماذا يعني هذا الكلام ؟
الـ
Extension
هي ميزة يمكنك إستخدامها مع أي كائن من كائنات الـ NET. وهي موجودة إبتداءً من الـ
NET Framework 3.5.
ما فائدتها وكيف يتم إستخدامها ؟
سأشرح لك الموضوع بمثال لتتضح الفكرة قليلاً :
تخيل أن لديك ( على سبيل المثال ) كنترول من نوع PictureBox , ( مثلاً وليس حصراً على الكنترولات , بل مع أي كائن كان , حتى مع الـ Object )
أنت الآن تريد أن تظيف Sub أو Function جديدة على هذا الكائن ( أمر ليس من الأوامر الإفتراضية الخاصة بهذا الكائن , أمر خاص بك أنت ).
مثلاً : أريد أن أقوم بإنشاء Sub يقوم بحفظ الصورة الموجودة في الـ PictureBox في القرص الصلب في مكان محدد (أو حتى في قاعدة البيانات ) وبعض الأمور التي تخصك قبل حفظ الصورة.
المعتاد أنك ستقوم بإستدعاء هذا الأمر وترسل له الـ PictureBox أو الصورة ليقوم بالعمل المطلوب.
دعنا نسمي الـ Sub بـ (
SaveMyPhoto )
كود :
Public Sub SaveMyPhoto(ByVal PicBox As PictureBox)
' PicBox ستبداء الآن بإستخدام الـ
' وإجراءات وتحقق ومن هذة الأمور المعتادة
End Sub
المعتاد أنك ستنادي هذا الأمر بهذة الطريقة :
كود :
SaveMyPhoto(Me.PictureBox1)
لكن بإستخدام الـ
Extension مع الـ Sub الذي قمنا بإنشائة (
SaveMyPhoto )
كود :
<System.Runtime.CompilerServices.Extension()>
Public Sub SaveMyPhoto(ByVal PicBox As PictureBox)
' PicBox ستبداء الآن بإستخدام الـ
' وإجراءات وتحقق ومن هذة الأمور المعتادة
End Sub
الآن يمكنك إستدعاء الأمر هكذا :
كود :
Me.PictureBox1.SaveMyPhoto()
لاحظ :
أصبح الأمر (
SaveMyPhoto ) أحد أوامر الكائن الـ PictureBox , وأي كائن PictureBox في كامل المشروع أصبح يمتلك هذا الأمر الجديد
الـ
Extension يجب أن تكون في
Module ولا تقبل أن تكون في مكان آخر !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
لماذا ؟
كما شرحت في الأعلى أن كل الـ PictureBox في المشروع أصبحوا يمتلكون هذا الأمر , لذلك لا يمكن جعلها في كلاس لأنها عامة لأي كائن في المشروع من نوع PictureBox
مثال آخر : وهو الموجود لديك الآن ( الـ Function ـ
FindAllChildren )
وظيفتها إرجاع كل الأبناء تحت كنترول معين نحن نحددة
كود :
<System.Runtime.CompilerServices.Extension()>
Public Function FindAllChildren(ByRef StartingContainer As Control) As List(Of System.Windows.Forms.Control)
' الكود المعتاد
End Function
لاحظ يوجد parameter باسم
StartingContainer
نوعة
Control
هذا يعني أن أي كائن من نوع
Control ستجد فية هذة الوظيفة الجديدة ,
Control يشمل كل الأدوات التي تظهر على الشاشة من ضمنها النافذة كذلك
Control عام أكثر
بإمكانك تغيير
Control وإستخدام شيء محدد , مثلاً Panel أو Button
نوع الناتج من الوظيفة هو
List(Of System.Windows.Forms.Control) : o
يمكنك تغييرة إلى أي نوع أنت تحتاج إلية طبعاً كما هو معروف.
الـ parameter الأول حصرياً خاص بتحديد نوع الكائن الذي سيتأثر بهذة الوظيفة
بإمكانك إضافة parameter آخر ( اسميتة Args ) وهو لتمرير أي بيانات لهذة الوظيفة
كود :
<System.Runtime.CompilerServices.Extension()>
Public Function FindAllChildren(ByRef StartingContainer As Control, ByVal Args As String) As List(Of System.Windows.Forms.Control)
' الكود المعتاد
End Function
وسيصبح الكود للتنفيذ هكذا :
كود :
Me.FindAllChildren("My Args")
بإمكان تغيير النوع إلى
String
وستجد هذة الوظيفة في كل متغير من نوع
String
كود :
<System.Runtime.CompilerServices.Extension()>
Public Sub ShowMyText(ByVal YourText As String)
MsgBox(YourText)
End Sub
وتستخدم هكذا :
كود :
Me.TextBox1.Text.ShowMyText
أو هكذا :
كود :
Dim MyName As String = "Abdulla Aldosari"
MyName.ShowMyText
الـ
Extension تدعم هذة الطرق فقط :
- Classes (reference types) o
- Structures (value types) o
- Interfaces
- Delegates
- ByRef and ByVal arguments
- Generic method parameters
- Arrays
تحياتي .