繁体   English   中英

如何使用 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 自己的 合约解析器中的元数据,您可以配置从IDataRecordMyClass类型的属性的名称映射。 完成此操作后,您可以从任何IDataReader (包括DataTable.CreateDataReader()返回的 IDataReader 到您的类型的实例列表)中的 map。

首先添加以下扩展方法:

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和 map 到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);

笔记:

  • 表中存在但 class 中存在的属性的错误处理,反之亦然,尚未实现,但大概可以实现。

  • 如果您的表是使用驼峰式列名创建的,您可以将CamelCasePropertyNamesContractResolver的实例作为CreateJsonDataReaderMap()的第二个参数传递,并且名称应该是正确的 map。

此处使用 AutoMapper 版本 9 的演示小提琴。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM