如何使用JsonProperty属性配置AutoMapper

问题描述 投票:0回答:1

我将如何配置AutoMapper以便能够通过使用JsonProperty属性进行映射将包含列“ C”和“ D”的数据表转换为MyClass列表?

JsonProperty
c# json json.net automapper
1个回答
0
投票

使用Json.NET自己的public class MyClass { [JsonProperty("C")] public string A { get; set; } [JsonProperty("D")] public string B { get; set; } } 中的元数据,您可以配置从contract resolver到类型IDataRecord的属性的名称映射。完成此操作后,您可以从任何IDataRecordMyClass返回的映射到您类型实例的列表。

首先添加以下扩展方法:

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>

© www.soinside.com 2019 - 2024. All rights reserved.