在 .NET Web API POST/PUT 方法中使用继承的类

Rap*_*ael 9 c# asp.net-core-webapi

我不知道如何在 Web API 控制器中使用继承的类。我只需创建一个API 控制器即可在数据库中创建和更新继承的对象。

与我的模型类似(所有这些模型都存在 Dto):

public class Animal
{
    public virtual string Name {get; set;} // e.g. Harry
    public virtual string Type {get; set;} // e.g. Dog
}

public class AnimalDto
{
    public string Name;
    public Type Type;
}

public class Dog : Animal
{
    public virtual bool CanBark {get; set;} // e.g. true
}

public class Cat : Animal
{
    public virtual bool CanMiau {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试在控制器中使用 json 。但总是有 jsonnull

[HttpPost]
public ActionResult Post([FromBody]JObject json)
{
    // idk what's going here?!
}
Run Code Online (Sandbox Code Playgroud)

现在是我的控制器,但这会切断狗或猫模型的所有属性

[HttpPost]
public ActionResult Post([FromBody]AnimalDto animal)
{
    // idk what's going here?!
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 .NET Core 2.0

有任何想法吗?谢谢!

编辑

如果我想动态地执行此操作怎么办?就像是:

var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

itm*_*nus 5

我已经尝试在控制器中使用 json 。但 json 总是为 null

你总是得到的原因null是你没有声明正确的Type. 您不应该string通过 接收某种动物[FromBody]

    [HttpPost]
    公共 ActionResult Post([FromBody]string json)
    公共 ActionResult Post([FromBody]Dog 狗)
    {
        // 现在你得到了狗
    }

附带说明一下,如果您根本不关心类型,一种方法是声明类型dynamic

[HttpPost]
public IActionResult Post([FromBody] dynamic json)
{
    return new JsonResult(json); 
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,动态类型是JObject,您可以根据需要将它们转换为任何类型:

public IActionResult Post(/*[ModelBinder(typeof(AnimalModelBinder))]*/[FromBody] JObject json)
{
    var animal=json.ToObject<Animal>();
    var dog = json.ToObject<Dog>();
    return new JsonResult(json); 
}
Run Code Online (Sandbox Code Playgroud)

现在是我的控制器,但这会切断狗或猫模型的所有属性

如果您想使用AnimalDto,您应该使属性可访问:

    公共类 AnimalDto
    {
        公共字符串名称;
        公共字符串名称{get;set;}
        公共字符串类型;
        公共字符串类型{get;set;}
    }

[编辑]

如果我想动态地执行此操作怎么办?就像是:

var animal = json.ToObject<Animal>();
var actualAnimal = json.ToObject<typeof(animal.Type)>();
Run Code Online (Sandbox Code Playgroud)

如果我们想将 json 转换为某种特定类型,我们首先必须知道目标Type是什么。但您的animal.Type属性是 的一种类型String,并且可能是一个约定字符串。如果这个Type属性正是没有命名空间的类名,例如

  • Cat.Type必须等于Cat
  • Dog.Type必须等于Dog
  • Fish.Type必须等于Fish

然后您可以使用它Type.GetType()来解析目标类型。例如 :

    [HttpPost]
    public ActionResult Post([FromBody]string json)
    public ActionResult Post([FromBody]Dog dog)
    {
        // now you get the dog
    }

不管怎样,您可以根据您自己的需求定制我们解决目标的方式Type。然后通过方法将 json 对象转换为您想要的TypeToObject<T>()

[HttpPost]
public IActionResult Post([FromBody] dynamic json)
{
    return new JsonResult(json); 
}
Run Code Online (Sandbox Code Playgroud)