我正在对许多不同的POCO对象进行序列化,这些对象都从同一个抽象类中继承,例如AbstractBaseClass
。序列化此类时,我使用WriteRecords<dynamic>
方法,该方法接受几乎所有内容,表面上使用反射将属性写入CSV。
我的问题是,我希望基类字段首先出现在文件中。看来CsvHelper的默认行为是将它们放在最后。
我可以看到有一种实例化映射器以对字段建立索引的方法,但是对于继承自AbstractBaseClass
的许多类型中的每一种类型,这样做都很难过。我只想配置一次,并使它对从所述类继承的任何内容都有效。更好的是,可以进行某种切换,使我可以更改CsvHelper在整个继承树中搜索字段的方式。
您可以使用通用方法来创建您的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; }
}