Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用JsonProperty属性配置AutoMapper_C#_Json_Json.net_Automapper - Fatal编程技术网

C# 如何使用JsonProperty属性配置AutoMapper

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

我需要如何配置AutoMapper,以便通过使用映射属性将包含列“C”和“D”的DataTable转换为MyClass列表

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()
    ,并且名称应该正确映射

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

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateJsonDataReaderMap<MyClass>();
});
var mapper = config.CreateMapper();
using var reader = table.CreateDataReader();
var result = mapper.Map<List<MyClass>>(reader);