دریافت مقدار از یک 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");