03-10-18, 06:08 PM
العفو أخي ay.alhaj
الـ Function ـ ( FindAllChildren )
تستخدم الـ Attribute
<Runtime.CompilerServices.Extension()>
ماذا يعني هذا الكلام ؟
الـ Extension
هي ميزة يمكنك إستخدامها مع أي كائن من كائنات الـ NET. وهي موجودة إبتداءً من الـ NET Framework 3.5.
ما فائدتها وكيف يتم إستخدامها ؟
سأشرح لك الموضوع بمثال لتتضح الفكرة قليلاً :
تخيل أن لديك ( على سبيل المثال ) كنترول من نوع PictureBox , ( مثلاً وليس حصراً على الكنترولات , بل مع أي كائن كان , حتى مع الـ Object )
أنت الآن تريد أن تظيف Sub أو Function جديدة على هذا الكائن ( أمر ليس من الأوامر الإفتراضية الخاصة بهذا الكائن , أمر خاص بك أنت ).
مثلاً : أريد أن أقوم بإنشاء Sub يقوم بحفظ الصورة الموجودة في الـ PictureBox في القرص الصلب في مكان محدد (أو حتى في قاعدة البيانات ) وبعض الأمور التي تخصك قبل حفظ الصورة.
المعتاد أنك ستقوم بإستدعاء هذا الأمر وترسل له الـ PictureBox أو الصورة ليقوم بالعمل المطلوب.
دعنا نسمي الـ Sub بـ ( SaveMyPhoto )
المعتاد أنك ستنادي هذا الأمر بهذة الطريقة :
لكن بإستخدام الـ Extension مع الـ Sub الذي قمنا بإنشائة ( SaveMyPhoto )
الآن يمكنك إستدعاء الأمر هكذا :
لاحظ :
أصبح الأمر ( SaveMyPhoto ) أحد أوامر الكائن الـ PictureBox , وأي كائن PictureBox في كامل المشروع أصبح يمتلك هذا الأمر الجديد
الـ Extension يجب أن تكون في Module ولا تقبل أن تكون في مكان آخر !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
لماذا ؟
كما شرحت في الأعلى أن كل الـ PictureBox في المشروع أصبحوا يمتلكون هذا الأمر , لذلك لا يمكن جعلها في كلاس لأنها عامة لأي كائن في المشروع من نوع PictureBox
مثال آخر : وهو الموجود لديك الآن ( الـ Function ـ FindAllChildren )
وظيفتها إرجاع كل الأبناء تحت كنترول معين نحن نحددة
لاحظ يوجد parameter باسم StartingContainer
نوعة Control
هذا يعني أن أي كائن من نوع Control ستجد فية هذة الوظيفة الجديدة , Control يشمل كل الأدوات التي تظهر على الشاشة من ضمنها النافذة كذلك
Control عام أكثر
بإمكانك تغيير Control وإستخدام شيء محدد , مثلاً Panel أو Button
نوع الناتج من الوظيفة هو List(Of System.Windows.Forms.Control) : o
يمكنك تغييرة إلى أي نوع أنت تحتاج إلية طبعاً كما هو معروف.
الـ parameter الأول حصرياً خاص بتحديد نوع الكائن الذي سيتأثر بهذة الوظيفة
بإمكانك إضافة parameter آخر ( اسميتة Args ) وهو لتمرير أي بيانات لهذة الوظيفة
وسيصبح الكود للتنفيذ هكذا :
بإمكان تغيير النوع إلى String
وستجد هذة الوظيفة في كل متغير من نوع String
وتستخدم هكذا :
أو هكذا :
الـ Extension تدعم هذة الطرق فقط :
تحياتي .
الـ 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
تحياتي .
