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 مورد نظر می توانستید مقدار شناسه پرسنل انتخابی را بدست آورید
اما با این قطعه کد چنانچه بخواهید به Model Type مورد نظرتون عمل Casting رو انجام بدید با خطا مواجه خواهید شد چون Type جدید از نوع  AnonymousType می باشد و شامل دو فیلد CustomerName,Code می باشد.
سوالاتی که پیش خواهد آمد:
1- مقدار Code رو چطور استخراج کنیم؟
2- AnonymousType یک Type موجود در کدها نیست که بتوان آیتم انتخابی را به آن Cast نموده و مقدار Code را دریافت نمود!
.
.
.
راه حل استفاده از Reflection می باشد و استفاده از تابع زیر پیشنهاد میشه=>
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");
 
این یک مثال از نوع های بی نام بوده و تحت هر شرایطی که نیاز به دریافت مقدار از یک نوع بی نام باشید می توانید به همین ترتیب عمل کنید


نوشته شده توسط مجتبی صحرائی در شنبه هجدهم خرداد ۱۳۹۲ و ساعت 18:38