آشنایی با شی ExpandoObjects

آشنایی با شی ExpandoObjects

شما با استفاده از ExpandoBject می توانید به کاربران خود توانایی ذخیره هر گونه اطلاعاتی که می خواهند داشته باشند را بدهید، حتی اطلاعاتی که جنس آنها تنها در زمان اجرا مشخص میشود. در حقیقت زمانی که نمیدانید داده های شما تا زمان اجرا چیست، ExpandoObject بهترین راه حل است.

معمولا، ما می دانیم که چه اطلاعاتی را می خواهیم استفاده کنیم: مثلا ممکن است یک شیء به نام Customer  با خواص مانند Id، FirstName، LastName و غیره داشته باشیم. اما گاهی هم، مانند خواندن فایلهای CSV با پوسته های مختلف است که، همه چیز به یک شکل در فایل ها ذخیره نشده است.

ممکن است تا حالا هم متوجه شده باشید که ExpandoObject بسیار شبیه anonymouse type ها هستند که نیازی به ایجاد ساختار مشخص در زمان تعریف شدن ندارند. اما ExpandoObejct ها به دو دلیل قابل انعطاف تر هستند. اول اینکه شما میتواند هر properties یا method ی را در هر نقطه ای از چرخه زندگی یک شی ExpandoObject اضافه کنید. در واقع الزامی به تعیین ویژگی و متدهای شی در زمان تعریف آن ندارید.

دوم اینکه شما میتوانید ExpandoObject را به عنوان خروجی یک متد برگردانید در حالی که این امکان برای anonymous type ها وجود ندارد.

تنها مشکلی که میشه به ExpandoObjectها گرفت این است که IntelliSense برای آنها وجود ندارد. البته این منطقی به نظر میرسد چراکه کامپایلر تا زمان اجرا از ویژگی های شی اطلاعی ندارد.

ذخیره اطلاعات در یک ExpandoObject

ExpandoObject در فضای نام System.Dynamic  قرار دارد که خودش قسمتی از دات نت فرم است که برای پشتیبانی از زبان های داینامیک به این محموعه اضافه شده است. کار با کلاس های این فضای نام، نیاز به تفکری متفاوت درباره اشیا دارد. برای مثال اضافه کردن properties و methods ها به یک شی بصورت پویا انجام میشود تنها با نام گذاری و اختصاص یک مقدار به آنها.

البته نوشتن چنین کدی اشتباه است

ExpandoObject cust = new ExpandoObject();

cust.FullName = "Morteza Jangjoo";

چرا که کامپایلر نمیداند با یک شی داینامیک سروکار دارد  بنابراین نیاز است این مورد را به نحوی مشخص کنیم

dynamic cust = new ExpandoObject();
cust.FullName = "Morteza jangjoo";

اعلان dynamic دز زمان تعریف متغییر به کامپایلر میگوید بررسی متدها و ویژگی های شی را تا زمان اجرای آن به تعویق بندازد. بنابراین فقط در لحظه اجرا اعضا، ویژگی ها، و متدهای شی بررسی میشود که وجود داشته باشند.

افزودن Method به ExpandoObject

شما میتوانید با استفاده از یک عبارت لامبادا میتوانید یک متد را به یک شی ExpandoObject اضافه کنید.  البته این کار کمی پیچیدگی هم دارد چراکه باید خروجی و ورودی عبارت لامبادا را نیز به نوعی تعیین نمایید.

cust.ChangeName = (Func<string, int>) ( (string newName) =>
            {
                cust.FullName = newName;
                return cust.FullName.Length;
            });

 

مثال بالا همان شی است مه در مثال قبل بصورت داینامیک ایجاد کردیم. در کد بالا سعی داریم که متدی به نام ChangeName را به شی اضافه کنیم. در کد بالا از Func که نوعی delegate است اسافاده شده است. از Func زمانی استفاده میشود که قصد تعریف متدی داشته باشیم که حتما خروجی دارد و میتواند ورودی هم داشته باشد. در کد بالا منظور از  Func<String, int> متدی است که ورودی رشته ای دارد و خروجی آن از نوع int  است.

عبارت لامبادا هم که بسیار گویاست. متغییر newName را دریافت و در خاصیت Fullname شی میریزد و سپس طول خاصیت Fullname را به عنوان خروجی باز میگرداند.

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

Int lenName= cust.ChangeName("Morteza Jangjoo");

با این فراخوانی خاصیت Fullname شی  به  Morteza Jangjoo تغییر میکند  و مقدار متغییر lenName نیز 15 خواهد بود.

با این روش هرجا برنامه که نیاز پیدا کنیم میتوانیم property  یا Method جدیدی به شی مون اضاقه کنیم.

آنچه گفته شد مقدمه ای برای آشنایی و معرفی شی ExpandoObject بود. در مقالات بعدی درباره کار با ExpandoObject  بیشتر صحبت خواهم کرد.

مرتضی جنگجو

برنامه نویس fullstack با بیش از 14 سال سابقه کار و همکاری در توسعه و پیاده سازی نرم افزارهای تحت وب با تکنولوژی Net. در شرکتهای بزرگ ایرانی، هلندی، فنلاندی و ترکیه

شبکه های اجتماعی نویسنده

دیدگاه کاربران