PDA

View Full Version : سوال: دریافت هر نوع Generic.List در ورودی متد



naeeme
دوشنبه 09 دی 1387, 09:55 صبح
من می خوام یه متد تعریف کنم که در پارامترهای ورودیش بتونه هر نوع لیستی با هر نوع datatype رو دریافت کنه. منظورم این هست که پارامتر ورودی به صورت Generic.List<T> باشه
چه جوری میشه این کار رو کرد؟؟

Behrouz_Rad
دوشنبه 09 دی 1387, 10:18 صبح
public static void MyMethod<T>(List<T> list)
{

}

یادت نره که System.Collections.Generic رو در برنامه using کنی.

موفق باشید.

naeeme
دوشنبه 09 دی 1387, 11:10 صبح
حالا یه سوال دیگه برام پیش اومد!! در این حالت چه جوری میشه به مقادیر ذخیره شده در اون لیست دسترسی پیدا کرد؟؟:متفکر:

Behrouz_Rad
دوشنبه 09 دی 1387, 11:22 صبح
در این صورت، اون متد حتما مقدار برگشتی از نوع List جنریک رو داره:


public static List<T> MyMethod<T>(List<T> list)
{

}



List<int> a = new List<int>();
a.Add(1);
a.Add(2);
List<int> b = MyMethod<int>(a);
foreach (int c in b)
{
// do something with c
}

موفق باشید.

naeeme
سه شنبه 10 دی 1387, 09:51 صبح
آقای راد. مرسی. اما به من به مقصودم نرسیدم( دلیلش بد سوال کردن خودمه دیگه)
منظور من از این سوال این بود که می خوام یه متد بنویسم که بتونه هر نوع list رو دریافت کنه و خروجی اون یه فایل متنی باشه که مقادیر موجود در اون لیست رو در فایل ریخته باشه!! یه چیزی مثل datasource در گرید که هر نوع object که از ICollection تعریف شده باشه رو می پذیره و مقادیر اون رو نشون میده.

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

sinpin
سه شنبه 10 دی 1387, 10:03 صبح
منظور من از این سوال این بود که می خوام یه متد بنویسم که بتونه هر نوع list رو دریافت کنه و خروجی اون یه فایل متنی باشه که مقادیر موجود در اون لیست رو در فایل ریخته باشه!! یه چیزی مثل datasource در گرید که هر نوع object که از ICollection تعریف شده باشه رو می پذیره و مقادیر اون رو نشون میده.
شما میتونید - بسته به نیاز - پارامتر ورودی متود رو از نوع اینترفیسهای : IEnumerable یا IList و یا ICollection بگیرید
خروجی متود هم میتونه یک MemoryStream یا نام فایل ساخته شده باشه

Behrouz_Rad
سه شنبه 10 دی 1387, 10:15 صبح
منظور من از این سوال این بود که می خوام یه متد بنویسم که بتونه هر نوع list رو دریافت کنه

شما اول در مورد لیست جنریک پرسیدی. مشخص کن و یک مثال بزن که ورودی متد چی هست تا راهنماییت کنم.

naeeme
سه شنبه 10 دی 1387, 15:33 عصر
شما اول در مورد لیست جنریک پرسیدی. مشخص کن و یک مثال بزن که ورودی متد چی هست تا راهنماییت کنم.
خوب؛ من هم اعتراف کردم که بد سوال کردم!! یک چهارم اون چیزی که تو ذهنم بود رو هم نپرسیدم!!

توضیح کامل مسئله( این دیگه 90٪ مسئله ذهنی منه!!)
یک متد کلی برای ایجاد خروجی متنی از لیستهای یک برنامه که مقادیر اون با ; تفکیک شده‌اند، می خوام بنویسم.
ورودی این متد لیستی هست که آیتمهاش از نوع یک استراکچر که توسط من( برنامه نویس) تعریف شده، هستن. اما مشکل اینجاست که در حال حاضر توی برنامه حداقل 5 نوع لیست متفاوت وجود داره که استراکچر آیتمهاشون با هم متفاوته اما همشون باید یه خروجی متنی داشته باشن. تعداد پراپرتی های این استراکچرها هم با هم متفاوته. امکان داره تعداد این لیست ها در طول توسعه برنامه افزایش پیدا کنه، پس کاملا منطقی هست که یک متد واحد نوشته بشه و تمام این لیستها به این متد واحد فرستاده بشن تا خروجی متنی ازشون دریافت بشه.
حالا، من در واقع یه متد می خوام که در هر سطر فایل متنی، داده های یک آیتم نوشته بشه و در هر سطر، داده های اون آیتم با ; از هم جدا بشن.

مثلا داشته باشم:
نام;نام خانوادگی;سال تولد
م;محمدی;1362
ن;ساجدی;1353

در ضمن می خوام که سطر اول این فایل، عنوان پراپرتی هام باشه. مثل همین مثال که در سطر اول در واقع عنوان پراپرتی ها گذاشته شده( حالا نه فارسی، انگلیسی)
============
اون چیزی که تو ذهنم بود، این بود که یک لیست با نوع آیتم T دریافت کنم و بتونم به طریقی به پراپرتی های T دسترسی پیدا کنم که بعدا دیدم نمیشه و از اساس اشتباه فکر می کردم.
یعنی فکر می کردم که به راحتی میشه نوع آیتم رو تشخیص داد و با یه cast میشه به داده های اون دسترسی پیدا کرد که خطای من در همین جا بود.
نام پراپرتی ها رو که میشه به دست اورد اما چه جوری میشه به داده ها به این صورت دسترسی پیدا کرد؟؟
استفاده از اینترفیس هم مشکلم رو حل نکرد( حداقل من با این دانش برنامه نویسیم نتونستم این کار رو بکنم)

Behrouz_Rad
سه شنبه 10 دی 1387, 20:09 عصر
چون سوالت به نظرم موضوع جالبی رسید، نمونه ی کاملش رو واست نوشتم.
در ابتدای صفحه:


using System.Reflection;
using System.Text;
using System.Collections.Generic;
using System.IO;

کد تولید خروجی:


public struct PersonRecords
{
public string Name;
public string Family;
public int Age;
}

public struct ProductsRecords
{
public string ProductName;
public double ProductPrice;
}

private string GenerateOutput(IList stru)
{
List<object> tempList = new List<object>();

foreach (var struItem in stru)
{
tempList.Add(struItem);
}

StringBuilder sb = new StringBuilder();

FieldInfo[] headerFields = tempList[0].GetType().GetFields();
Array.ForEach(headerFields, f => sb.Append(f.Name + ";"));
sb = sb.Remove(sb.Length - 1, 1);
sb = sb.Insert(sb.Length, Environment.NewLine);

Array.ForEach(tempList.ToArray(), strItem =>
{
FieldInfo[] fields = strItem.GetType().GetFields();
Array.ForEach(fields, f => sb.Append(f.GetValue(strItem) + ";"));
sb = sb.Remove(sb.Length - 1, 1);
sb = sb.Insert(sb.Length, Environment.NewLine);
});

return sb.ToString();
}

نحوه ی استفاده:


List<PersonRecords> lst1 = new List<PersonRecords>();

PersonRecords stru1;
stru1.Name = "Behrouz";
stru1.Family = "Rad";
stru1.Age = 120;

PersonRecords stru2;
stru2.Name = "Hasan";
stru2.Family = "Kachal";
stru2.Age = 6;

lst1.Add(stru1);
lst1.Add(stru2);
string result = this.GenerateOutput(lst1);

StreamWriter sw = new StreamWriter(@"C:\Report.txt");
sw.Write(result);
sw.Close();


1) امیدوارم منظورت رو درست متوجه شده باشم.
2) برنامه ی بالا رو کپی پیست و اجرا کن و به فایل Report.txt که در درایو C تولید میشه دقت کن.
3) میبینی که استراچکر ProductsRecords رو هم تعریف کردم اما ازش استفاده نکردم. این رو بر عهده ی خودت گذاشتم که ببینی اون متد با هر Structure ای کار می کنه.

موفق باشید.