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
اميربهاءالدين سبط الشيخ