如果无法给要映射的类添加特性,在这种情况下,可以使用 ClassMap 方式进行映射。 (类不是我们写的,或者不想干扰到它)
使用映射和使用特性效果是一样的,坑爹的地方也一样坑爹。以下示例用属性实现了上面特性的功能。
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Amount { get; set; }
public DateTime JoinTime { get; set; }
public string Msg { get; set; }
public string Msg2 { get; set; }
public bool Vip { get; set; }
public string Remarks { get; set; }
public string None { get; set; }
public int Data { get; set; }
}
public class StudentMap : ClassMap<Student>
{
public StudentMap()
{
Map(m => m.ID).Index(0).Name("id");
Map(m => m.Name).Index(1).Name("name");
Map(m => m.Amount).TypeConverterOption.Format("0.00");
Map(m => m.JoinTime).TypeConverterOption.Format("yyyy-MM-dd HH:mm:ss");
Map(m => m.Msg).Default("Hello");
Map(m => m.Msg2).Ignore();
Map(m => m.Vip)
.TypeConverterOption.BooleanValues(true, true, new string[] { "yes" })
.TypeConverterOption.BooleanValues(false, true, new string[] { "no" });
Map(m => m.Remarks).Optional();
Map(m => m.None).TypeConverterOption.NullValues("None", "none", "Null", "null");
Map(m => m.Data)
.TypeConverterOption.NumberStyles(NumberStyles.HexNumber)
.TypeConverterOption.Format("X2");
}
}
在使用映射前,需要先注册
csv.Configuration.RegisterClassMap<StudentMap>();
ConvertUsing 允许使用一个委托方法实现类型转换。
// 常数
Map(m => m.Constant).ConvertUsing(row => 3);
// 把两列聚合在一起
Map(m => m.Name).ConvertUsing(row => $"{row.GetField<string>("FirstName")} {row.GetField<string>("LastName")}");
Map(m => m.Names).ConvertUsing(row => new List<string> { row.GetField<string>("Name") } );