То, что вы хотите сделать, может быть сделано, но оно делает некоторые предположения и может быть легко нарушено.В конечном итоге вы должны переосмыслить свою структуру CSV.Это решение вручную записывает запись заголовка и использует пользовательский TypeConverter
для распечатки каждого MyCustom
класса.
Допущения
- Каждый
MyClass
будет иметь одинаковое число MyCustom
, и идентификаторы будут совпадать между каждой MyClass
записью. Идентификаторы MyCustom будут распечатываться в одном и том же порядке каждый раз. (Обновление: добавлено OrderBy
для решения этой проблемы.)
public static void Main(string[] args)
{
var records = new List<MyClass> {
new MyClass {
Property = "Title",
MyCustoms = new List<MyCustom> {
new MyCustom { Id = "123", Property1 = "John", Property2 = "Smith" },
new MyCustom { Id = "456", Property1 = "Helen", Property2 = "Thomson"}
}
},
new MyClass {
Property = "AnotherProperty",
MyCustoms = new List<MyCustom> {
new MyCustom { Id = "123", Property1 = "Another11", Property2 = "Another12" },
new MyCustom { Id = "456", Property1 = "Another21", Property2 = "Another22"}
}
}
};
using (var csv = new CsvWriter(Console.Out))
{
csv.Configuration.TypeConverterCache.AddConverter<List<MyCustom>>(new MyTypeConverter());
csv.Configuration.HasHeaderRecord = false;
// Get all of the ids from the first record.
var ids = records[0].MyCustoms.OrderBy(m => m.Id).Select(m => m.Id).ToList();
csv.WriteField("Property");
foreach (var id in ids)
{
csv.WriteField("Id");
csv.WriteField($"{id}_Property1");
csv.WriteField($"{id}_Property2");
}
csv.NextRecord();
csv.WriteRecords(records);
}
Console.ReadKey();
}
public class MyClass
{
public string Property { get; set; }
public List<MyCustom> MyCustoms {get;set;}
}
public class MyCustom
{
public string Id { get; set; }
public string Property1 { get; set; }
public string Property2 { get; set; }
}
private class MyTypeConverter : DefaultTypeConverter
{
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
var list = ((List<MyCustom>)value).OrderBy(m => m.Id).ToList();
foreach (var item in list)
{
row.WriteField(item.Id);
row.WriteField(item.Property1);
row.WriteField(item.Property2);
}
return null;
}
}