使用 .NET CsvHelper 库时,是否有一种简单的方法可以将基础 class 字段放在第一位?

When using the .NET CsvHelper library, is there an easy way to put the base class fields first?

我正在序列化许多不同的 POCO 对象,它们都继承自一个共同的抽象 class - 例如 AbstractBaseClass。序列化此 class 时,我使用 WriteRecords<dynamic> 方法,该方法几乎可以接受任何内容,表面上使用反射将属性写入 CSV。

我遇到的问题是,我希望基本 class 字段在文件中排在第一位。看起来 CsvHelper 的默认行为是将它们放在最后。

我知道有一种方法可以实例化一个映射器来为字段建立索引,但是对于从 AbstractBaseClass 继承的许多类型中的每一种来说,这样做都有些困难。我只想配置一次,并让它适用于从 class 继承的任何东西。更好的是,将是某种切换,可以让我改变 CsvHelper 在继承树中搜索字段的方式。

您可以使用通用方法创建您的 ClassMap 并将基础 class 属性的索引设置为负数,以便它们位于继承 [=] 的属性之前14=].

public class Program
{
    public static void Main(string[] args)
    {        
        var records = new List<Foo> {
            new Foo{Id = 1, FirstName = "FirstName1", FooProperty = "Foo1", LastName = "LastName1"},
            new Foo{Id = 2, FirstName = "FirstName2", FooProperty = "Foo2", LastName = "LastName2"}
        };

        var config = GetFooBaseConfiguration(records);

        using (var csv = new CsvWriter(Console.Out, config))
        {
            csv.WriteRecords(records);
        }

        Console.ReadKey();
    }

    public static CsvConfiguration GetFooBaseConfiguration<T>(IEnumerable<T> records) where T : FooBase
    {
        var config = new CsvConfiguration(CultureInfo.InvariantCulture);

        var classMap = new DefaultClassMap<T>();

        classMap.AutoMap(CultureInfo.InvariantCulture);
        classMap.Map(m => m.FirstName).Index(-1,-2);
        classMap.Map(m => m.LastName).Index(-2,-3);

        config.RegisterClassMap(classMap);

        return config;
    }
}

public abstract class FooBase
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Foo : FooBase
{
    public int Id { get; set; }
    public string FooProperty { get; set; }
}