属性已被删除,因为它们的功能非常有限。映射结构允许更多的可能性。
您应该能够直接映射到您的 EF 模型。这是映射更好的另一个原因。与属性不同,它允许您映射到无法将源更改为的类。
如果该类与您的 CSV 文件匹配,则您无需执行任何操作。
void Main()
{
using( var stream = new MemoryStream() )
using( var reader = new StreamReader( stream ) )
using( var writer = new StreamWriter( stream ) )
using( var csv = new CsvWriter( writer ) )
{
var people = new List<Person>
{
new Person
{
Name = "Joe User",
Address = new Address
{
Street = "123 4th Street",
},
},
};
csv.WriteRecords( people );
writer.Flush();
stream.Position = 0;
reader.ReadToEnd().Dump();
}
}
public class Person
{
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street { get; set; }
}
输出:
Name,Street
Joe User,123 4th Street
如果要进行更改,可以创建一个映射文件来解释这些更改。你仍然可以AutoMap
并且只是改变你想要的东西。
void Main()
{
using( var stream = new MemoryStream() )
using( var reader = new StreamReader( stream ) )
using( var writer = new StreamWriter( stream ) )
using( var csv = new CsvWriter( writer ) )
{
var people = new List<Person>
{
new Person
{
Name = "Joe User",
Address = new Address
{
Street = "123 4th Street",
},
},
};
csv.Configuration.RegisterClassMap<PersonMap>();
csv.WriteRecords( people );
writer.Flush();
stream.Position = 0;
reader.ReadToEnd().Dump();
}
}
public class Person
{
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street { get; set; }
}
public sealed class PersonMap : CsvClassMap<Person>
{
public PersonMap()
{
AutoMap();
Map( m => m.Name ).Name( "Full Name" );
}
}
输出:
Full Name,Street
Joe User,123 4th Street
如果需要,您可以管理参考并完全控制。
老实说,我不认为属性会重新出现。虽然有些人真的想使用它们。我一直在考虑的一个选项是在其中一些我认为不应该成为主库一部分的其他东西上添加一个扩展,对于那些想要使用它的人来说仍然存在。或者更好的是,其他人应该启动 CsvHelperContrib 项目并包含类似的内容。Attribute
映射,并DataAnnotations
可能成为其中的一部分。