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

تابع مورد نظر رو به شکل ذیل نوشتم:
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();
}

protected void Page_Load(object sender, EventArgs e)
{
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();
} موفق باشید.