c# Automapper - 属性序列

c# Automapper - Sequence of Properties

类 创建如下:

public class Base
{
   public int Id { get; set; }
}
public class Derived:Base
{
   public string Name { get; set; }
}

Automapper 映射定义为:

CreateMap<DataRow, Base>()
.ForMember(m => m.Id, opt => opt.MapFrom(r => r["Id"]));

CreateMap<DataRow, Derived>()
.IncludeBase<DataRow, Base>()
.ForMember(m => m.Name, opt => opt.MapFrom(r => r["Name"]))

此映射的输出是:

{
 "Name":"ABC",
 "Id":1
}

预期结果:

{
 "Id":1,
 "Name":"ABC"
}

我想保持在基础和派生中定义的属性序列 class。

这与 Automapper 无关,该库不影响 JSON 序列化。

真正的问题是你有一个派生的 class。序列化库使用反射来获取属性,它从派生的 class 中的属性开始,并在层次结构中向上移动。您可以使用以下代码查看:

var props = string.Join(", ", typeof(Derived).GetProperties().Select(x => x.Name));

//props = "Name, Id"

但是,您可以使用一些属性来控制序列化。如果您使用的是 .NET 3+,那么您可能会使用 System.Text.Json 命名空间。这意味着您可以将模型更改为如下所示:

using System.Text.Json.Serialization;

public class Base
{
    [JsonPropertyOrder(1)]
    public int Id { get; set; }
}
public class Derived : Base
{
    [JsonPropertyOrder(2)]
    public string Name { get; set; }
}

或者,您可能正在使用 Newtonsoft JSON.Net,这意味着您的模型将如下所示:

using Newtonsoft.Json;

public class Base
{
    [JsonProperty(Order = 1)]
    public int Id { get; set; }
}
public class Derived : Base
{
    [JsonProperty(Order = 2)]
    public string Name { get; set; }
}