C# 如何使用JsonProperty属性配置AutoMapper
我需要如何配置AutoMapper,以便通过使用映射属性将包含列“C”和“D”的DataTable转换为MyClass列表C# 如何使用JsonProperty属性配置AutoMapper,c#,json,json.net,automapper,C#,Json,Json.net,Automapper,我需要如何配置AutoMapper,以便通过使用映射属性将包含列“C”和“D”的DataTable转换为MyClass列表 public class MyClass { [JsonProperty("C")] public string A { get; set; } [JsonProperty("D")] public string B { get; set; } } 使用Json.NET自身的元数据,您可以配置从一个到您类型的属性的名称映射MyCla
public class MyClass
{
[JsonProperty("C")]
public string A { get; set; }
[JsonProperty("D")]
public string B { get; set; }
}
使用Json.NET自身的元数据,您可以配置从一个到您类型的属性的名称映射
MyClass
。完成此操作后,您可以从任何IDataReader
映射到类型的实例列表,包括返回的实例
首先添加以下扩展方法:
public static class AutomapperJsonExtensions
{
static readonly IContractResolver defaultResolver = new JsonSerializer().ContractResolver;
public static void CreateJsonDataReaderMap<TDestination>(this IMapperConfigurationExpression cfg, IContractResolver resolver = null)
{
resolver = resolver ?? defaultResolver;
var contract = resolver.ResolveContract(typeof(TDestination)) as JsonObjectContract ?? throw new ArgumentException(string.Format("{0} is not a JSON object.", typeof(TDestination)));
var map = cfg.CreateMap<IDataRecord, TDestination>();
foreach (var p in contract.Properties.Where(p => !p.Ignored && p.Writable))
{
// Map PropertyName in reader to UnderlyingName in TDestination
map.ForMember(p.UnderlyingName, opt => opt.MapFrom(r => r[p.PropertyName]));
}
}
}
注:
- 尚未实现表中存在但类中不存在的属性的错误处理,反之亦然,但可能会实现
- 如果表是使用驼峰大小写的列名创建的,则可以将的实例作为第二个参数传递给
,并且名称应该正确映射CreateJsonDataReaderMap()
var config = new MapperConfiguration(cfg =>
{
cfg.CreateJsonDataReaderMap<MyClass>();
});
var mapper = config.CreateMapper();
using var reader = table.CreateDataReader();
var result = mapper.Map<List<MyClass>>(reader);