#c# #csv
Вопрос:
У меня есть эти занятия.
public Record1(UniqueWallPart uniqueWallpart)
{
public readonly string field1 = "";
public readonly string field2 = "";;
}
public class Record1Map : ClassMap<Record1>
{
private Record1Map ()
{
Map(m => m.field1).Index(0).Name("f1");
Map(m => m.field2).Index(1).Name("f2");
}
}
И быстро то же Record2
самое, но в других областях.
У меня есть класс, список которого нужно записать Record1
в csv-файл
using CsvHelper;
using CsvHelper.Configuration;
class writerRecord1
{
private ImmutableArray<SegmentRecord> Record1 ;
public string ToCsv()
{
using var writer = new StringWriter();
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.Context.RegisterClassMap<Record1Map>();
csv.WriteRecords(Records);
writer.Flush();
return writer.ToString();
}
}
Я хотел бы разложить код на множители, чтобы написать ToCsv в a classWriter2
.
Но в csv.Context.RegisterClassMap<Record1Map>();
я должен четко написать, какой класс я использую.
Как я могу разложить этот код на множители?
Я знаю, что название не очень хорошее. Может кто-нибудь помочь мне найти название получше, пожалуйста
Комментарии:
1. К сожалению, это не то место, чтобы просить о рефакторинге кода, мы помогаем с конкретными проблемами.
2. С какой объективной проблемой вы сталкиваетесь и каких конкретных улучшений вы ждете?
3. Вы спрашиваете, как реализовать дженерики?
4. Если вам нужна простая
ToCSV
функция, удалитеRegisterClassMap
ее , примитеList<string> headers, List<List<string>> data
и преобразуйте другие классы в строки в другом месте5. Один тип может иметь несколько классов
ClassMap<>
. Либо поэтому вам нужно как-то связать T и его карту. И регистрация его с помощью конструктора может быть лучше, чем информирование записи о правильном картографе.
Ответ №1:
Почему вы не используете простую универсальную реализацию?
Фрагмент кода находится здесь:
using CsvHelper;
using CsvHelper.Configuration;
class WriterRecord<T, TMap>
where T: class
where TMap: ClassMap<T>
{
private ImmutableArray<T> Records;
public string ToCsv<T>()
{
using var writer = new StringWriter();
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.Context.RegisterClassMap<TMap>();
csv.WriteRecords(Records);
writer.Flush();
return writer.ToString();
}
}
Вы можете использовать этот класс в своем коде примерно так
new WriterRecord<Record1, Record1Map>()
new WriterRecord<Record2, Record2Map>()
Это работает на вас?
Комментарии:
1. Если
T
это запись, то она не может быть зарегистрирована как картаClassMap<T>
2. Понял. Я вижу твою проблему. Похоже, нам нужно создать экземпляр
ClassMap<T>
типа. Это может быть реализовано с помощью отражения. Дайте мне немного времени для экспериментов…3. @DragAndDrop Да, вы абсолютно правы. Мы можем использовать дженерики с 2 параметрами (фрагмент кода был обновлен).