使用.NET CsvHelper库时,有没有一种简单的方法可以将基类字段放在首位?

问题描述 投票:0回答:1

我正在对许多不同的POCO对象进行序列化,这些对象都从同一个抽象类中继承,例如AbstractBaseClass。序列化此类时,我使用WriteRecords<dynamic>方法,该方法接受几乎所有内容,表面上使用反射将属性写入CSV。

我的问题是,我希望基类字段首先出现在文件中。看来CsvHelper的默认行为是将它们放在最后。

我可以看到有一种实例化映射器以对字段建立索引的方法,但是对于继承自AbstractBaseClass的许多类型中的每一种类型,这样做都很难过。我只想配置一次,并使它对从所述类继承的任何内容都有效。更好的是,可以进行某种切换,使我可以更改CsvHelper在整个继承树中搜索字段的方式。

c# csvhelper
1个回答
0
投票

您可以使用通用方法来创建您的ClassMap,并将基类的属性上的索引设置为负数,以使它们早于继承类的属性。

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);
        classMap.Map(m => m.LastName).Index(-2);

        config.RegisterClassMap(classMap);

        return config;
    }
}

public 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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.