تقييم الموضوع :
  • 2 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
مقال: Reflection وكيفية استخدامها في برامجنا
#2
الكشف عن التجميعات المرتبطة (المحملة) مع أحد التطبيق

أنشئ مشروع Console Application واستبدل محتويات Module1.vb بالكود التالي

كود C#

كود :
using System;
using System.Reflection ;


    class ReferencedAssemblies
    {
        [STAThread]
        static void Main(string[] args)
        {
            Assembly[] appAssemblies =
              System.AppDomain.CurrentDomain.GetAssemblies ();
            foreach (Assembly assembly in appAssemblies )
            {
                Console.WriteLine (assembly.FullName );
            }
            Console.ReadLine ();
        }
    }


كود VB

كود :
Imports System.Reflection
Namespace ReflectionDemo
    Class ReferencedAssemblies
        Private Shared Sub Main(ByVal args As String())
            Dim appAssemblies As Assembly() = System.AppDomain.CurrentDomain.GetAssemblies()
            For Each assembly As Assembly In appAssemblies
                Console.WriteLine(assembly.FullName)
            Next
            Console.ReadLine()
        End Sub
    End Class


يقوم الإجراءا GetAssemblies() أحد اعضاء الفئة AppDomain بإرجاع التجميعات التي قام البرنامج ReflectionDemo بتحميلها والناتج هو التجميعين ReflectionDemo و MsCorLib

عند تنفيذ البرنامج سيظهر في ال Console مايلي:

كود :
mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ReflectionDemo, Version=1.0.1882.29904, Culture=neutral, PublicKeyToken

الحصول على الأنواع الموجودة ضمن تجميع معيّن

أول ما يجب القيام به, هو تحميل التجميع ديناميكيا باستخدام الإجراء Assembly.Load().

كود VB
كود :
Dim LoadedAssembly As Assembly = Assembly.Load("mscorlib.dll")
كود C#
كود :
Assembly LoadedAssembly = Assembly.Load("mscorlib.dll");


بعد تحميل التجميع, يمكن الإجراء GetTypes() للحصول على مصفوفة من النوع Type


كود VB
كود :
Dim ExistingTypes As System.Type() = LoadedAssembly.GetTypes()


كود C#
كود :
System.Type[] ExistingTypes = LoadedAssembly.GetTypes ();


الأنواع العائدة يمكن أن تمثل إما فئات Classes, أو واجهات Interfaces, أو تراقيم Enumerations.


كود VB
كود :
Imports System
Imports System.Reflection
Namespace ReflectionDemo
    Class ReflectedTypes
        Private Shared Sub Main(ByVal args As String())
            Dim LoadedAssembly As Assembly = Assembly.Load("mscorlib.dll")
            Dim ExistingTypes As System.Type() = LoadedAssembly.GetTypes()
            For Each type As Type In ExistingTypes
                Console.WriteLine(type.ToString())
            Next
            Console.WriteLine(ExistingTypes.Length & " Types Discovered in mscorlib.dll")
            Console.ReadLine()
        End Sub
    End Class
End Namespace


كود C#
كود :
using System;
using System.Reflection ;
namespace ReflectionDemoCSharp
{
    class ReflectedTypes
    {
        [STAThread]
        static void Main(string[] args)
        {
            Assembly LoadedAssembly = Assembly.Load ("mscorlib.dll");
            System.Type[] ExistingTypes = LoadedAssembly.GetTypes ();
            foreach(Type type in ExistingTypes)
                Console.WriteLine (type.ToString ());
            Console.WriteLine (ExistingTypes.Length +
               " Types Discovered in mscorlib.dll");
            Console.ReadLine ();
        }
   }
}


سيقوم الـ Console بعرض جميع الأنواع الموجودة ضمن التجميع mscorlib.dll, وهذا مجرد مقطع من الناتج:


كود :
System.Object
System.ICloneable
System.Collections.IEnumerable
System.Collections.ICollection
System.Collections.IList
System.Array
System.Array+SorterObjectArray
System.Array+SorterGenericArray
System.Collections.IEnumerator
1480 Types Discovered in mscorlib.dll


تطبيق Reflection على نوع محدّد


في المثال التالي, سنقوم بعملية انعكاس على نوع واحد والكشف عن الأعضاء الخاصة به, الإجراء Type.GetType تأخذ معامل واحد من النوع string, وتعيد كائن من النوع الموافق, وللاستعلام عن أعضاء نوع معين نستخدم الإجراء Type.GetMembers والتي تعيد مصفوفة من النوع MemberInfo


كود VB:


كود :
Imports System
Imports System.Reflection
Namespace ReflectionDemo
    Class ReflectedTypes
        Sub Main(ByVal args As String())
            Dim TypeToReflect As Type = Type.GetType("System.Int32")
            Dim Members As System.Reflection.MemberInfo() = TypeToReflect.GetMembers()
            
            Console.WriteLine("Members of " & TypeToReflect.ToString())
            Console.WriteLine()
            For Each member As MemberInfo In Members
                Console.WriteLine(member)
            Next
            Console.ReadLine()
        End Sub
    End Class
End Namespace


كود C#
كود :
using System;
using System.Reflection ;
namespace ReflectionDemoCSharp
{
    class ReflectedTypes
    {
        [STAThread]
        static void Main(string[] args)
        {
            Type TypeToReflect = Type.GetType("System.Int32");
            System.Reflection.MemberInfo[] Members =TypeToReflect.GetMembers();
            Console.WriteLine ("Members of "+TypeToReflect.ToString ());
            Console.WriteLine();
            foreach (MemberInfo member in Members )
                Console.WriteLine(member);
            Console.ReadLine ();
        }
    }
}


الناتج سيكون كالتالي:


كود :
Members of System.Int32
Int32 MaxValue
Int32 MinValue
System.String ToString(System.IFormatProvider)
System.TypeCode GetTypeCode()
System.String ToString(System.String, System.IFormatProvider)
Int32 CompareTo(System.Object)
Int32 GetHashCode()
Boolean Equals(System.Object)
System.String ToString()
System.String ToString(System.String)
Int32 Parse(System.String)
Int32 Parse(System.String, System.Globalization.NumberStyles)
Int32 Parse(System.String, System.IFormatProvider)
Int32 Parse(System.String, System.Globalization.NumberStyles, System.IFormatProvider)
System.Type GetType()


الحصول على الأعضاء حسب أنواعها:


كود :
Dim Members As System.Reflection.MemberInfo() = TypetoReflect.GetMembers()
إرجاع كافة الأعضاء الخاصة بالنوع الذي نستعلم عنه.
كود :
Dim Members As System.Reflection.MethodInfo() = TypetoReflect.GetMethods()


إرجاع الإجراءات الخاصة بالنوع الذي نستعلم عنه.


كود :
Dim Members As System.Reflection.FieldInfo() = TypetoReflect.GetFields()
إرجاع الحقول الخاصة بالنوع الذي نستعلم عنه.


كود :
Dim Members As System.Reflection.PropertiesInfo() = TypetoReflect.GetProperties()
إرجاع الخصائص الخاصة بالنوع الذي نستعلم عنه.


كود :
Dim Members As System.Reflection.EventInfo() = TypetoReflect.GetEvents()
إرجاع الأحداث الخاصة بالنوع الذي نستعلم عنه.


كود :
Dim Members As System.Reflection.ConstructorInfo() = TypetoReflect.GetConstructors()
إرجاع المنشئات الخاصة بالنوع الذي نستعلم عنه.


كود :
Dim Members As System.Type () = TypetoReflect.GetInterfaces()
إرجاع الواجهات التي ينفذها النوع الذي نستعلم عنه.
الرد }}}
تم الشكر بواسطة: ابو ابراهيم , ابو ليلى


الردود في هذا الموضوع
مقال: Reflection وكيفية استخدامها في برامجنا - بواسطة Islam Ibrahim - 17-09-12, 12:55 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  شاهد حداءة ( مقال الوحي يضحد كل قول وإن قال العظام العالمون ) مسوق اونلاين 0 575 23-08-22, 10:33 PM
آخر رد: مسوق اونلاين
  الفرق بين الحلم والكابوس وكيفية التفرقة بينهم حسام هيكل 0 1,075 17-04-20, 12:35 AM
آخر رد: حسام هيكل
  [مقال منقول] مشروع Mono : شغل الدوت نت على اللينكس أو أي نظام تشغيل تحلم به الشاكي لله 6 5,891 13-03-14, 02:02 AM
آخر رد: الشاكي لله
  مقال- كيف نحل مشاكلنا بأنفسنا- RaggiTech 0 2,379 27-10-12, 04:23 PM
آخر رد: RaggiTech
  مقال تقني- Windows Vista وVisual Studio RaggiTech 0 2,506 09-10-12, 11:46 AM
آخر رد: RaggiTech
  مقال: DotNET Components Licencing RaggiTech 0 2,035 09-10-12, 11:44 AM
آخر رد: RaggiTech
  مقال- التخزين المعزول Isolated Storage RaggiTech 1 2,273 09-10-12, 11:42 AM
آخر رد: RaggiTech
  مقال- التوثيق في الدوت نت Documenting In .NET RaggiTech 4 3,558 09-10-12, 11:40 AM
آخر رد: RaggiTech
  مقال: كيف نحل مشاكلنا بأنفسنا- RaggiTech 0 2,289 09-10-12, 11:25 AM
آخر رد: RaggiTech
  مقال- ما لا تعرفونه عن Web browser Control RaggiTech 1 2,260 09-10-12, 11:23 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: