如何将派生列表 类 映射到 DTO?

How to map a list of derived classes to DTO?

我有一个简单的查询,我想将其映射到我的 DTO。

{
  "list": [
    { "propA": "A1" },
    { "propA": "A2" },
    { "propB": "B1" },
    ...
  ]
}

我尝试过类似的方法,但当然 .net 无法弄清楚哪个 class 应该用于映射到:

public abstract class BaseClass {
}

public class ClassA : BaseClass {
  public string PropA { get; set; }
}

public class ClassB : BaseClass {
  public string PropB { get; set; }
}

public class MyDto {
  public List<BaseClass> List { get; set; }
}

为了完整起见,最后是我的控制器 class 方法:

[HttpPost]
public Task<IActionResult> Create(MyDto obj) {
  ...
}

所以问题是,如何将我的 JSON 请求正文映射到具有 PropAPropB 属性的对象中?

假设您正在使用 Json.Net 来(反)序列化 json,JsonSubTypes 库支持根据特定属性的存在反序列化为一组子 classes每个子class:

https://github.com/manuc66/JsonSubTypes#deserializeobject-mapping-by-property-presence

在你的例子中,你会装饰你的底座 class 用:

[JsonConverter(typeof(JsonSubtypes))]
[JsonSubtypes.KnownSubTypeWithProperty(typeof(ClassA), "PropA")]
[JsonSubtypes.KnownSubTypeWithProperty(typeof(ClassB), "PropB")]