我将如何配置AutoMapper以便能够通过使用JsonProperty
属性进行映射将包含列“ C”和“ D”的数据表转换为MyClass列表?
JsonProperty
使用Json.NET自己的public class MyClass
{
[JsonProperty("C")]
public string A { get; set; }
[JsonProperty("D")]
public string B { get; set; }
}
中的元数据,您可以配置从contract resolver到类型IDataRecord
的属性的名称映射。完成此操作后,您可以从任何IDataRecord
到MyClass
返回的映射到您类型实例的列表。
首先添加以下扩展方法:
IDataReader
现在您可以配置DataTable.CreateDataReader()
并将表映射到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("Source was not a JSON object.");
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
的实例作为MapperConfiguration
的第二个参数传递,并且名称应正确映射。
使用AutoMapper版本9的演示小提琴List<MyClass>
。