Я использую CsvHelper. Чтобы выполнить сопоставление между моим объектом и файлом CSV, я использую CsvClassMap
. Класс, который я сопоставляю сам с собой, содержит другие классы. В настоящее время для выполнения сопоставления с внутренними классами я использую ConvertUsing
для CsvPropertyMap
. Пример ниже. Car
— мой основной объект, и он содержит Engine
, а движок разбирается в отдельном методе:
public sealed class CarMapping : CsvClassMap<Car>
{
CarMapping()
{
Map(m => m.Id).Name("CarId");
Map(m => m.Color).Name("CarColor");
Map(m => m.YearOfProduction).Name("YearOfProduction");
Map(m => m.Engine).ConvertUsing(ParseEngine);
}
private Engine ParseEngine(ICsvReaderRow row)
{
var year = row.GetField<int>("EngineYear");
var cc = row.GetField<int>("EngineCC");
return new Engine()
{
Year = year,
CC = cc,
};
}
}
Это работает. Но чего я хотел бы добиться, так это использовать сопоставление внутри другого сопоставления. Что-то вроде (гипотетического решения) ниже:
public sealed class EngineMapping : CsvClassMap<Engine>
{
EngineMapping()
{
Map(m => m.Year).Name("EngineYear");
Map(m => m.Cc).Name("EngineCC");
}
}
А затем используйте EngineMapping
внутри CarMapping
:
public sealed class CarMapping : CsvClassMap<Car>
{
CarMapping()
{
Map(m => m.Id).Name("CarId");
Map(m => m.Color).Name("CarColor");
Map(m => m.YearOfProduction).Name("YearOfProduction");
// Not real code. Something I would like to be able to use.
// Use a mapping inside the current mapping
Map(m => m.Engine).ConsumeClassMap<EngineMapping>();
}
}
CsvClassMap<T>
класс. Я использую этот конкретный класс в некоторых других методах. Если бы я мог получить по одному для каждого класса вместо одного огромного для основного класса, это значительно упростило бы мое решение. - person PiotrWolkowski   schedule 31.05.2016