تولید انواع اطلاعات با 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

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

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها