PDA

View Full Version : کار با Type و PropertyInfo



سار
شنبه 28 مهر 1386, 14:36 عصر
کد زیر رو نوشتم که فکر کنم از قیافش پیداست که داره چیکار می کنه.
کلاسی دارم که بسته به نوعی که انتخاب میشه یک WEBControl می سازه. بعضی از Property های این نوع ساخته شده در کلاس من موجود هست و می خوام مقدار اون Property رو جایگزین مقدار WEbBontrolی که ساختم بکنم.

فقط نمیدونم در قسمتی که به رنگ قرمز نشون دادم باید چی بنویسم!!!
تو قسمت قرمز ظاهرن باید نام Property نوشته بشه ولی از کجا؟!!


foreach (PropertyInfo ControlInfo in answer.Control.GetType().GetProperties())
foreach (PropertyInfo AnswerInfo in answer.GetType().GetProperties())
{
if ((ControlInfo.PropertyType == AnswerInfo.PropertyType) && (ControlInfo.Name == AnswerInfo.Name))
ControlInfo.SetValue(answer.Control as object, AnswerInfo.GetValue(null,null), null);
}

مثلن اون خط اگر به شکل

info[5].SetValue(answer.Control as object, TextBoxMode.Password, null);
نوشته بشه همه چیز درست کار می کنه.

PC2st
شنبه 28 مهر 1386, 23:46 عصر
پارامتر اول باید برای مشخص کردن نمونه شیئ بکار برده بشه:


AnswerInfo.GetValue(TextBoxMode,null)

که اگر نمونه شیئ AnswerInfo در حلقه foreach روی خاصیت Password تنظیم شود، میتوان توسط کد فوق به مقدار خاصیت Password از نمونه شیئ TextBoxMode دسترسی داشت.

سار
یک شنبه 29 مهر 1386, 11:57 صبح
سلام
به دلیل فوری بودن موضوع تونستم با کد زیر کارم رو راه بندازم.
از توجه و راهنمایی شما هم تشکر میکنم.


foreach (PropertyInfo ControlInfo in answer.Control.GetType().GetProperties())
foreach (PropertyInfo AnswerInfo in answer.GetType().GetProperties())
if ((ControlInfo.PropertyType == AnswerInfo.PropertyType) && (ControlInfo.Name == AnswerInfo.Name))
{
if (AnswerInfo.GetValue(answer, null) != null)
ControlInfo.SetValue(answer.Control asobject, AnswerInfo.GetValue(answer, null), null);
}
MethodInfo methodInfo = answer.Control.GetType().GetMethod("DataBind");
if (methodInfo != null)
methodInfo.Invoke(answer.Control, null);

سار
دوشنبه 30 مهر 1386, 12:04 عصر
باز دو باره به مشکل بر خورد کردم

privatevoid SetValue(object Control)
{
object objValue = null;
object Value = null;
PropertyInfo pInfo = Control.GetType().GetProperty("Items");
if (pInfo != null)
{
Value = pInfo.GetValue(Control, null);
string[] strValues = objValue.ToString().Split(',');
ListItemCollection items = ((ListItemCollection)Value);
foreach (ListItem item in items)
foreach (string s in strValues)
if (s == item.Value)
item.Selected = true;
pInfo.SetValue(Control, (object)items, null);
}
}

به خط آخر که میرسه Error میده که : Property set method not found.

چرا؟
در ضمن pInfo.CanWrite مقدار false بر میگردونه!!!!!

سار
دوشنبه 30 مهر 1386, 12:17 عصر
وای نتیجه

pInfo.GetSetMethod()
null شد!!!
یعنی هیچ متدی برای Write نداره!!!:عصبانی::گیج:
چی کار باید بکنم؟!!:عصبانی++:

سار
دوشنبه 30 مهر 1386, 12:20 عصر
لطفن راهنمایی کنید.
اگر روش کار من تو کد آخری که فرستادم درست باشه و چیزی که فهمیدم هم درست این یعنی این که هرچه ریسیده بودم پنبه شد!!!
امیدوارم که اشتباه از من باشه.

سار
دوشنبه 30 مهر 1386, 12:30 عصر
با حذف کد :

pInfo.SetValue(Control, (object)items, null);

همه چیز درست کار کرد!!
ببینم واقن نیازی به SetValue نبود؟
چرا؟
کسی میتونه توضیحی به من بده؟

PC2st
دوشنبه 30 مهر 1386, 21:35 عصر
چون خاصیت Items ، بلوک set رو پیاده سازی نکرده است و بصورت فقط خواندنی عمل میکنه.


در ضمن pInfo.CanWrite مقدار false بر میگردونه!!!!!

یعنی هیچ متدی برای Write نداره!!!
همانطور است که خودتون متوجه شده اید.