PDA

View Full Version : حرفه ای: مقداردهی کل فیلدهای یک کلاس توسط کلاس دیگر



wolf_majid
شنبه 04 بهمن 1393, 21:51 عصر
سلام دوستان
متد زیر رو در نظر بگیرید
public static bool Edit(DaftarPishkhan daftar)
{
if (daftar == null) throw new NullReferenceException("پارامتر ورودی نباید نال باشد");
var fetchById = SelectFromId(daftar.Id);
if (fetchById == null) throw new Exception("دفتر پیشخوانی با این آیدی وجود ندارد");
if (!daftar.cityCode.HasValue || ZoneRepository.SelectFromCityCode(daftar.cityCode. Value) == null)
throw new Exception("کد شهر نامعتبر است");

//foreach (var property in daftar.GetType().GetProperties())
//{
// var propertyInfo = fetchById.GetType().GetProperty(property.Name);
// propertyInfo.SetValue(fetchById,property.GetValue( property.Name,null),null);
//}

fetchById.Address = daftar.Address;
fetchById.cityCode = daftar.cityCode;
fetchById.Hozeh = daftar.Hozeh;
fetchById.Id = daftar.Id;
fetchById.LastNameSherkatName = daftar.LastNameSherkatName;
fetchById.NationalCode = daftar.NationalCode;
fetchById.PostalCode = daftar.PostalCode;
fetchById.TellCode = daftar.TellCode;
fetchById.TellNo = daftar.TellNo;

Entities.SaveChanges();
return true;
}

چطور میشه بجای اینکه من کلاس fetchById رو دونه دونه مقداردهی کنم به یکباره اون را با پارامتر ورودی مقداردهی کنم ؟

NASA's Spaceman
یک شنبه 05 بهمن 1393, 00:00 صبح
منظورت رو نفهمیدم ولی همون بالا که میخوای پارامترها رو در کنار اسم متد انتخاب میکنی میتونی اونجا پارامتر ها رو تعریف کنی و تو برنامه فقط استفاده کنی و میتونی یه پارامتر ورودی رو توی کلاست برا هر چندتا جای متدت که میخوای قرارش بدی یعنی یه ورودی میخواد که توی کلاس، اون ورودی برا مثال 100 جای مختلف از یه متد استفاده میشه ولی توی استفاده ازش فقط یه ورودی نیاز داره و اگه مشکلت این هست به نظرم شی گرایی رو دقیق تر یادبگیر تا خودت متوجه همه چی بشی
با سپاس Spaceman

wolf_majid
یک شنبه 05 بهمن 1393, 00:17 صبح
سلام
ممنون از جوابت
بگذارید یک جور دیگه سوال کنم
فرض کنید من بعدها میخوام به کلاسم فیلد اضافه کنم اما نمیخوام این متد ویرایش بشه
میخوام این متد خودش اتوماتیک تمام فیلدهای پارامتر را واکشی کنه و فیلدهای سطر واکشی شده از جدول را بروز کنه
چند خط رو کامنت کردم که بهم جواب نداد اما تقریبا" یک همچین چیزی میخوام

Saman_12
یک شنبه 05 بهمن 1393, 01:07 صبح
از GetFields و GetProperties که آرایه ای از نوع FieldInfo و PropertyInfo f برمیگردونه باید استفاده کنید یا از GetMembers استفاده کنید و MemberType رو چک کنید (System.Reflection).

wolf_majid
یک شنبه 05 بهمن 1393, 01:31 صبح
ممنون
الان به پروپرتی ها دسترسی دارم اما چطور به مقادیرشون دسترسی پیدا کنم ؟

Saman_12
یک شنبه 05 بهمن 1393, 01:43 صبح
با متد GetValue که باید خود کلاس رو بهش بدی.

wolf_majid
یک شنبه 05 بهمن 1393, 01:51 صبح
خیلی ممنون
حل شد
foreach (var property in daftar.GetType().GetProperties())
{
var propertyInfo = fetchById.GetType().GetProperty(property.Name);
var value = property.GetValue(daftar, null);
propertyInfo.SetValue(fetchById, value, null);
}

Saman_12
یک شنبه 05 بهمن 1393, 02:02 صبح
خواهش میکنم این رو همینطوری نوشتم برای مثال (مث اینکه شما زود تر دست به کار شدید!) :

public class TestCLS
{


public Int32 A_I { get; set; }
public Int32 B_I { get; set; }
}



Type tc_type = typeof(TestCLS);
PropertyInfo[] tc_pr = tc_type.GetProperties();


TestCLS tc = new TestCLS();
TestCLS tcClone = new TestCLS();


tc.A_I = 10;
tc.B_I = 90;




foreach (PropertyInfo item in tc_pr)
{
item.SetValue(tcClone, item.GetValue(tc, null), null);
}


Console.WriteLine(tcClone.A_I);
Console.WriteLine(tcClone.B_I);
}