使用 .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; }
}
我正在序列化许多不同的 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; }
}