عنوان:

‫دریافت مقدار از یک AnonymousType


نویسنده: مجتبی صحرائی
تاریخ: ۱۳۹۲/۰۳/۱۸ ۲۲:۳۵
آدرس: www.dntips.ir

AnonymousType‌ها به شما این امکان را میدهند که بدون ساخت Type جدیدی چندین پراپرتی رو در یک object قرار بدید و از اون استفاده کنید.

به مثال زیر توجه کنید:

var v = new { Amount = 108, Message = "Hello" };
Console.WriteLine(v.Amount + v.Message);

دقت داشته باشید که در این مثال Typeی بنام V از قبل ساخته نشده بود و فیلد‌های Amount,Message هم وجود ندارند اما با استفاده از AnonymousType‌ها این امکان فراهم شده تا بتونید بدون ساخت Type، رفتار Type‌ها رو شبیه سازی کنید.

بطور مثال فرض کنیم می‌خواهیم نام و شناسه پرسنل رو در یک ComboBox نمایش دهیم. برای این منظور نیازی نیست که تمام فیلد‌های مربوط به پرسنل را بازیابی نموده و تنها نام و شناسه پرسنل را نمایش دهیم و همانطور که بسیاری از شما می‌دانید تنها نام و شناسه پرسنل را بازیابی می‌کنیم که این مورد را با استفاده از AnonymousType انجام می‌دهیم =>

var business = new Customers();
var modelsCollection = business.GetAll(w => w.MCode);
cmbCustomerName.DataSource = modelsCollection.Select(w => new { w.CustomerName, w.Code }).ToList();

چنانچه از modelsCollection فیلد و یا فیلدی را انتخاب نمی‌کردیم و از تمام فیلد‌ها استفاده می‌کردیم برای دریافت آیتم انتخاب شده مشکلی نداشتیم و با یک Cast ساده به Model Type مورد نظر، می‌توانستیم مقدار شناسه پرسنل انتخابی را بدست آوریم اما با این قطعه کد چنانچه بخواهیم عمل Casting را برای Model Type مورد نظر انجام دهیم، با خطا مواجه خواهیم شد چون Type جدید از نوع  AnonymousType بوده و شامل دو فیلد CustomerName,Code می‌باشد.

سوالاتی که پیش خواهد آمد:
1- مقدار Code رو چطور استخراج کنیم؟
2- AnonymousType یک Type موجود نیست که بتوان آیتم انتخابی را به آن Cast نموده و مقدار Code را دریافت نمود!
.
.
.

با استفاده از Reflection قادر خواهید بود مقدار فیلد مورد نظر خود را از یک AnonymousType  استخراج کنید. برای این منظور تابع زیر رو در نظر بگیرید =>

public static T GetValueFromAnonymousType<T>(object dataitem, string itemkey)
{
Type type = dataitem.GetType();
T itemvalue = (T)type.GetProperty(itemkey).GetValue(dataitem, null);
return itemvalue;
}

با استفاده از این تابع براحتی خواهید توانست مقدار Code را بدست بیاورید =>

int code = GetValueFromAnonymousType<int>(cmbCustomerName.SelectedItem, "Code");
این یک مثال از نوع‌های بی نام بوده و تحت هر شرایطی که نیاز به دریافت مقدار از یک نوع بی نام داشته باشید می‌توانید به همین ترتیب عمل کنید 

نظرات

  • محسن خان در ۱۳۹۲/۰۳/۱۸ ۲۲:۴۵
    یک سؤال: combo boxها عموما selectedText و selectedValue هم دارند. در این حالت عموما مقدار این‌ها رشته‌ای است. در این صورت نیازی به این cast نیست.
    • مهمان در ۱۳۹۲/۰۳/۱۸ ۲۲:۵۱
      بله درسته. هدف از بیان این مثال درک مفهوم AnonymousType و استفاده از تابع GetValueFromAnonymousType بود
      میتونید این تابع رو در Library خودتون جای بدید و به موقع از اون استفاده کنید
  • پدرام جباری در ۱۳۹۲/۰۳/۱۹ ۱۲:۵
    سلام؛ روش شما درست هست ولی از dynamic هم میشه استفاده کرد که در زمان compile ایرادی نگیره.