如何使用 JsonProperty 属性配置 AutoMapper
How to configure AutoMapper using JsonProperty attribute
我需要如何配置 AutoMapper 才能使用 JsonProperty
属性将包含列 "C" 和 "D" 的 DataTable 转换为 MyClass 列表?
public class MyClass
{
[JsonProperty("C")]
public string A { get; set; }
[JsonProperty("D")]
public string B { get; set; }
}
将 Json.NET 自己的 contract resolver you can configure a name mapping from an IDataRecord
to properties of your type MyClass
. Having done that, you can map from any IDataReader
including the one returned by DataTable.CreateDataReader()
中的元数据用于您的类型的实例列表。
首先添加如下扩展方法:
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]));
}
}
}
现在您可以配置 MapperConfiguration
并将 table 映射到 List<MyClass>
,如下所示:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateJsonDataReaderMap<MyClass>();
});
var mapper = config.CreateMapper();
using var reader = table.CreateDataReader();
var result = mapper.Map<List<MyClass>>(reader);
备注:
table 中存在但 class 中不存在的属性的错误处理尚未实现,但大概可以实现。
如果您的 table 是使用驼峰式列名创建的,您可以将 CamelCasePropertyNamesContractResolver
的实例作为第二个参数传递给 CreateJsonDataReaderMap()
并且名称应该映射正确。
Demo fiddle here 使用 AutoMapper 版本 9.
我需要如何配置 AutoMapper 才能使用 JsonProperty
属性将包含列 "C" 和 "D" 的 DataTable 转换为 MyClass 列表?
public class MyClass
{
[JsonProperty("C")]
public string A { get; set; }
[JsonProperty("D")]
public string B { get; set; }
}
将 Json.NET 自己的 contract resolver you can configure a name mapping from an IDataRecord
to properties of your type MyClass
. Having done that, you can map from any IDataReader
including the one returned by DataTable.CreateDataReader()
中的元数据用于您的类型的实例列表。
首先添加如下扩展方法:
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]));
}
}
}
现在您可以配置 MapperConfiguration
并将 table 映射到 List<MyClass>
,如下所示:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateJsonDataReaderMap<MyClass>();
});
var mapper = config.CreateMapper();
using var reader = table.CreateDataReader();
var result = mapper.Map<List<MyClass>>(reader);
备注:
table 中存在但 class 中不存在的属性的错误处理尚未实现,但大概可以实现。
如果您的 table 是使用驼峰式列名创建的,您可以将
CamelCasePropertyNamesContractResolver
的实例作为第二个参数传递给CreateJsonDataReaderMap()
并且名称应该映射正确。
Demo fiddle here 使用 AutoMapper 版本 9.