PDA

View Full Version : سوال: خروجی متدی سه تا لیست از نوع کلاسی می باشد. پس از دریافت چطوری به نوع خودش تبدیل کنم



دلتنگ اسمان
شنبه 05 تیر 1395, 09:35 صبح
با سلام
ببخشید شاید مبتدی باشه. اما در متدی که سه تا لیست از نوع کلاسی رو تولید میکنه ، میخوام این سه تا لیست رو دریافت و هر کدام رو به نوع خودش تبدیل کنم.
حقیقتش نمیدونم این سه تا لیست رو با آرایه برگردونم یا با تیبل و .... . چون با هر چیزی که برگردونم موقع دریافت نمیتونم به نوع خودش تبدیل کنم و خطا میده.

متد به این شکله :

private static DataTable Listes(DataTable dtd)
{
List<ClsReportModel> reportT = new List<ClsReportModel>();
List<ClsReportModel> reportE = new List<ClsReportModel>();
List<ClsReportModel> reportJ = new List<ClsReportModel>();

....
.
انجام عملیات
.

DataTable dtcl = new DataTable();
dtcl.Rows.Add();
dtcl.Columns.Add(); dtcl.Columns.Add(); dtcl.Columns.Add();
// List<ClsReportModel> reportT
dtcl.Rows[0][0] = reportT;
dtcl.Rows[0][1] = reportE;
dtcl.Rows[0][2] = reportJ;
return dtcl;
}

موقع دریافت که به شکل زیر هست خطا میده:

List<ClsReportModel> reportT = (List<ClsReportModel>)dtcl.Rows[0][0];
List<ClsReportModel> reportE = (List<ClsReportModel>)dtcl.Rows[0][1];
List<ClsReportModel> reportJ = (List<ClsReportModel>)dtcl.Rows[0][2];
این رو هم بگم وقتی نوع برگشتی متد به صورت زیر باشه و یک لیست برگردونه مشکلی ندارم. مشکل من زمانیه که بخوام سه تا لیست برگردونم:

private static List<ClsReportModel> Listes(DataTable dtd)
{

این هم پیغام خطا :

Unable to cast object of type 'System.String' to type 'System.Collections.Generic.List`1[kara.ClsReportModel]'

sds1920
شنبه 05 تیر 1395, 11:10 صبح
علتش این هست که ستون های DataTable از نوع داده های پایه میگیره و به صورت پیش فرض نوع اون string هست. پس زمانی که شما لیست رو توی سلول قرار میدی در واقع خودش میاد و متد ToString رو فراخوانی میکنه. شما برای اینکار بهتره از آرگومان های ref یا out استفاده کنید

دلتنگ اسمان
شنبه 05 تیر 1395, 11:25 صبح
ممنون از توجهتون
میشه بیشتر توضیح بدید چطوری از ref و out برای لیستها استفاده کنم. (اگه میشه با کد )

sds1920
شنبه 05 تیر 1395, 11:27 صبح
private static void Listes(DataTable dtd,out List<ClsReportModel> reportT,out List<ClsReportModel> reportE,out List<ClsReportModel> reportJ)
{
reportT = new List<ClsReportModel>();
reportE = new List<ClsReportModel>();
reportJ = new List<ClsReportModel>();

....
.
انجام عملیات
.

}

دلتنگ اسمان
شنبه 05 تیر 1395, 11:33 صبح
دوست عزیز
در این صورت باید سه بار متد رو فراخوانی کنم درسته؟(برای هر لیست یکبار)
من میخواستم با یکبار فراخوانی هر سه لیست رو پر کنم.

sds1920
شنبه 05 تیر 1395, 11:40 صبح
دوست عزیز
در این صورت باید سه بار متد رو فراخوانی کنم درسته؟(برای هر لیست یکبار)
من میخواستم با یکبار فراخوانی هر سه لیست رو پر کنم.

این چیزی که میگید بی معنی هست
برای فرخوانی کافی هست خط زیر رو بنویسید

Listes(dtd, out reportT, out reportE, out reportJ)