Reflection در #C

یکشنبه 24 خرداد 1394

Reflection یک نمونه از نوع اتصال به یک شی موجود را ایجاد می کند یا یک نوع از یک شی را دریافت می کند و روش ها و دسترسی به خواص آن ها را فراخوانی می کند .

Reflection یک نمونه از نوع اتصال به یک شی موجود را ایجاد می کند یا یک نوع از یک شی را دریافت می کند و روش ها و دسترسی به خواص آن ها را فراخوانی می کند . اگر در دستورات از ویژگی ها استفاده می کنید، Reflection شما را قادر می سازد به آن ها دسترسی داشته باشید .

استفاده از انواع (className)

می توانیم از متد typeof برای دریافت اطلاعات از متدها ، اعضا و به این ترتیب بخشی از کلاس خاص استفاده کنید . به مثال زیر توجه کنید :

مرحله 1:
 

مرحله 2:

این کد خروجی زیر را باز می گرداند:

همچنین می توانیم اطلاعات درباره ویژگی های یک  کلاس خاص را دریافت کنیم. مانند نمونه زیر :

    System.Reflection.PropertyInfo[] propertyInfo = _type.GetProperties();  
    foreach (PropertyInfo pi in propertyInfo)  
    {  
    Console.WriteLine(pi.Name);  
    }

مرحله 3:

اگر این دستور را به دستورات قبلی اضافه کنیم خروجی به این صورت می شود :

 

استفاده از ()GetType

 با استفاده از متد GetType از کلاس System.Reflection می توانیم یک assembly inspected دریافت کنیم . دستورات به این صورت هستند :

مرحله 4:

کلاس System.Reflection

 

همانطور که مشاهده شد،تفاوت زیادی بین GetType و typeof وجود ندارد . تفاوت عملکردی بین این دو چیست ؟

typeof یک کلمه کلیدی #C است که زمانی که نام کلاس را داریم استفاده می شود. آن در زمان کامپایل محاسبه می شود و بنابراین نمی تواند در نمونه ای که در زمان اجرا ایجاد شده استفاده شود . GetType متدی از کلاس می باشد که می تواند در یک نمونه مورد استفاده قرار گیرد .

اتصال اولیه(Early Binding) در مقابل اتصال بعدی (Late Binding)

- عملکرد در اتصال اولیه خوب خواهد بود.

- برنامه ها در  اتصال اولیه سریع تر اجرا می شوند ،از آنجایی که هیچ  boxing و Unboxing در اینجا انجام نشده، اما در اتصال ثانویه به تبدیل نوع برای رمز گشایی در زمان اجرا نیازمندیم .

-در اتصال اولیه (Early Binding) نوشتن کد آسان تر است ، از زمانی که واژه هوش در تکنولوژی در معرض عموم قرار گرفت .

- در اتصال اولیه احتمال خطای کمتری وجود دارد،از آنجایی که دستورات در زمان کامپایل بررسی شده اند اما در اتصال بعدی احتمال خطای بیشتری در زمان اجرا وجود دارد .

- اتصال ثانویه همه انواع نسخه ها را به دلیل توزیع در زمان اجرا پشتیبانی می کند .

- اگر اتصال ثانویه مورد استفاده قرار گیرد ،تاثیر دستورات در پیشرفت هی آینده به حداقل می رسد .

اتصال ثانویه با استفاده از Reflection

اتصال ثانویه می تواند با استفاده از Reflection  انجام شود . برای مثال،در برخی برنامه ها،نمی دانیم کدام assembly برای بار گذاری در زمان کامپایل است ، بنابراین از کاربر درخواست می کنیم که نام و نوع assembly را در زمان اجرا وارد کند و برنامه می تواند آن را بارگذاری کند.برای این منظور،System.Reflection.Assembly سه روش استاتیک ارائه می دهد که اجازه می دهد یک فایل را به سادگی بار گذاری کنید : LoadForm ، Load و LoadWithPartialName . این متد ها به LoadLibrary Win32 API شباهت دارند . فضای نام System.Reflection با assembly و metadata کار می کند.

مرحله 5:

در اینجا مثالی از استفاده Lata Binding در #C با استفاده از Reflection ذکر شده است:

باید آدرس DLL در سیستم را تغییر دهید. همانطور که در دستورات قبلی مشاهده کردید متد ()GetType در زمان اجرا است .

قربانی

نویسنده 44 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 1 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید