Как разложить этот код на множители, напишите в csv-файле

#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 параметрами (фрагмент кода был обновлен).