0

توليد انواع اطلاعات با DLR در زمان اجرا

 
samsam
samsam
کاربر طلایی1
تاریخ عضویت : بهمن 1387 
تعداد پست ها : 50672
محل سکونت : یزد

توليد انواع اطلاعات با DLR در زمان اجرا

 
DLR سرويسي است كه روي CLR (كه خودش جزو اصلي هسته چارچوب كاري دات‌نت است) قرار مي‌گيرد. اين سرويس شامل بخش‌هاي زير است:

Dynamic Type System: اين بخش وظيفه ارائه انواع داده‌اي را به عهده دارد كه بين تمام زبان‌هايي كه براي DLR توسعه داده شده‌اند، مانند Ruby و Python مشترك باشد. شما مي‌توانيد با استفاده از DLR براحتي به انواع داده در اين زبان‌ها دسترسي داشته باشيد.

Dynamic Dispatch Method : اين بخش بدون اين‌كه صراحتا اعلام شود كه يك متد يا تابع چه پارامتري دارد آن را متد يا تابع را بر اساس متغير‌هاي ورودي‌ا ش فراخواني مي‌كند.

Dynamic Code Generation

Hosting API

كاربرد DLR در زمان توسعه برنامه

زبان‌هايي مثل#C و Visual Basic.NET زبان‌هايي اصطلاحا Statically Typed هستند. يعني انواع داده‌اي كه از آن استفاده مي‌كنند بايد زمان نوشتن كد مشخص شود و كامپايلر در زمان كامپايل مي‌داند برنامه شما از چه نوع داده‌هايي استفاده مي‌كند.

اما در زبان‌هايي مثل PHP، Lisp و SmallTalk نيازي به تعريف صريح نوع داده نيست و مقداري كه در يك متغير قرار مي‌گيرد نشان‌دهنده نوع آن است. همين طور شما مي‌توانيد يك نوع داده را در زمان اجرا توليد و از آن استفاده كنيد.

در نسخه 3 زبان سي شارپ و نسخه 9 زبان ويژوال بيسيك، يك ويژگي به نام Anonymous Type اضافه شد كه به شما اين امكان را مي‌داد تا بتوانيد يك نوع داده جديد را بدون هيچ ساختار داده‌اي تعريف كنيد. بر اساس اين امكان، اين نوع داده در زمان كامپايل مشخص مي‌شد و كماكان اين زبان‌ها را به عنوان Statically Typed نگه مي‌داشت. به كدهاي زير دقت كنيد:

Var anonymousType = new {Name = “JameJam”، Id=1};

anonymousType.Name = “Click!”;

 

اين كد به زبان سي شارپ يك نوع داده از پيش تعريف شده ساخته است، اما زماني كه اين كد كامپايل مي‌شود كامپايلر، يك نوع داده كه گاهي به صورت،AnonymousType« » يا اسامي‌شبيه به اين است توليد مي‌كند. مي‌توان گفت كه اين نوع داده در زمان كامپايل ساخته مي‌شود. هنوز با نوع داده‌اي كه در زمان اجرا ساخته مي‌شود فاصله داريم!

در سال 2007 ماكروسافت در كنفراسيDLR Mix را معرفي و در پايان سال 2008 نسخه نهايي 9/0 آن را منتشر كرد. در فوريه سال 2010 هم نسخه يك آن را منتشر كرد.

همان طور كه گفته شد DLR اين امكان را به شما مي‌دهد كه يك نوع داده در زمان اجرا بسازيد و از آن استفاده كنيد. كد زير را ببينيد:

Dynamic d = new dynamicObject();

d.Name = “JameJam”;

d.PublishedDate = DateTime.Now;

d.Print(“Click!”);

نكته اي كه قابل تامل است اين است كه dynamicObject شامل هيچ كدام از ويژگي‌هاي Name، PublishDate و همين طور متد Print نيست، اما در زمان اجرا اين ويژگي‌ها و متد به آن اضافه شده است و شما مي‌توانيد از آنها استفاده كنيد. مثلا:

Public void DoNothing(dynamic d){

Console.WriteLine(d.Name);

}

DoNothing(d);

در تابع DoNothing يك متغيير از نوع dynamic تعريف شده است و مقدار ويژگي Name آن را چاپ مي‌كند. نكته‌اي كه بايد به آن دقت كنيد اين است كه اگر متغيري كه به تابع DoNothing مي‌دهيد داراي ويژگي Name نباشد خطا مي‌گيرد.

اين را هم در نظر بگيريد كه اين متد براي تمامي ‌انواع داده كه داراي ويژگي‌اي به نام Name هستند نيز كار مي‌كند. پس هيچ محدوديتي از لحاظ پارامتر ورودي ندارد!

بسيار خب، حال ما چه طور يك نوع داده dynamic بسازيم؟

براي اين كار بايد يك شي dynamic از كلاس ExpandoObject به صورت زير تعريف كنيد:

Dynamic d = new ExpandoObject();

D يك شيء دايناميك است و مي‌توانيد به آن ويژگي يا متد اضافه كنيد. به اين صورت:

d.Name = “Iran”;

d.ToDo = new Func،int،int»(x=»{ return x++;});

بسيار خب، از اين به بعد مي‌توانيم بنويسيم.

Int x = d.ToDo(10);

اما در واقع چه اتفاقي پشت پرده مي‌افتد؟ كلاس شامل يك Dictionary«string,object» ExpandoObject است و زماني كه شما يك ويژگي يا متد به آن اضافه مي‌كنيد يك سري متد كه در كلاس بالاتر از ExpandoObject وجود دارد، فراخواني مي‌شوند و اسم و مقدار ويژگي يا متد شما را به ديكشنري اضافه مي‌كنند.

اين ديكشنري مي‌داند كه يك شي دايناميك چه متد‌ها يا ويژگي‌هايي دارد و زماني كه مي‌خواهيد از يك ويژگي يا متد استفاده كنيد دوباره يكسري متد فراخواني مي‌شوند و مقدار آن ويژگي يا متد را بر مي‌گردانند و سپس آن را فراخواني يا مقداردهي مي‌كنند.

تمامي‌اين متد‌ها در كلاس پدر ExpandoObject كه DynamicObject است، پياده سازي شده اند و شما خودتان مي‌توانيد با يك ارث بري از كلاس DynamicObject يك كلاس شي دايناميك توليد كنيد. براي آشنايي بيشتر با DynamicObject و نحوه استفاده از آن براي توليد يك شيء dynamic مي‌توانيد كد زير را مشاهده كنيد. براي مشاهده كد به آدرس زير مراجعه كنيد:

http://dotnetdeveloper.persiangig.com/Click/Program.cs

اميربهاءالدين سبط الشيخ

چهار راه برای رسیدن به آرامش:
1.نگاه کردن به عقب و تشکر از خدا  2.نگاه کردن به جلو و اعتماد به خدا  3.نگاه کردن به اطراف و خدمت به خدا  4.نگاه کردن به درون و پیدا کردن خدا

پل ارتباطی : samsamdragon@gmail.com

تالارهای تحت مدیریت :

مطالب عمومی کامپیوتراخبار و تکنولوژی های جدیدسیستم های عاملنرم افزارسخت افزارشبکه

 

چهارشنبه 9 فروردین 1391  9:54 AM
تشکرات از این پست
arak_iran
arak_iran
کاربر برنزی
تاریخ عضویت : خرداد 1389 
تعداد پست ها : 102
محل سکونت : مرکزی

پاسخ به:توليد انواع اطلاعات با DLR در زمان اجرا

بسیار مطلب مفیدی بود از زحمتتان ممنونم   

چهارشنبه 9 فروردین 1391  10:11 AM
تشکرات از این پست
دسترسی سریع به انجمن ها