gpt4 book ai didi

c# REST API 多态返回类型

转载 作者:行者123 更新时间:2023-11-30 14:23:33 25 4
gpt4 key购买 nike

我创建了如下具有继承性的数据契约(Contract):-

[DataContract(Name = "Animal")]
public class Animal { ... }

[DataContract(Name = "Dog ")]
public class Dog : Animal { // Has some Dog specific member properties }

[DataContract(Name = "Cat ")]
public class Cat : Animal { // Has some Cat specific member properties }

我正在使用 ASP.NET WebApi 来提供 REST API,例如:

[HttpGet]
public Task<Animal> Get(string type)
{
switch(type)
{
case "dog":
Dog dog = GetDogDetails();
return Task.FromResult(dog);
break;

case "cat":
Cat cat = GetCatDetails();
return Task.FromResult(cat);
break:
}
}

我无法退回相应的动物类型。我收到以下错误:-“无法将 Dog 隐式转换为 Animal”。

根据 REST API 标准,这种多态响应也是一件好事。

最佳答案

你得到这个错误的原因是因为你返回了一个 Task<T>任务不是协变的。也就是说,即使 DogAnimal , Task<Dog>不是 Task<Animal> .

你能做什么?

  1. 将您的代码更改为

        case "dog":
    Animal dog = GetDogDetails();
    return Task.FromResult(dog);
    break;

不过你会失去狗的特殊属性。

  1. 杠杆 Task<IHttpActionResult>并返回 Ok(yourObject) .

    [HttpGet]
    public async Task<IHttpActionResult> Get(string type)
    {
    switch(type)
    {
    case "dog":
    Dog dog = GetDogDetails();
    return Ok(dog);
    break;

    ...
    }
    }

我认为你应该走第二条路。

第二点,我真的没有看到任何使用 async/await 的理由这里。为什么要使用 Task.FromResult ?如果你的GetDogDetails方法是 async , 考虑 awaiting它。我认为您不应该担心当前代码中的任务。

Also is this polymorphic response a good thing as per REST API standards.

我不知道正式标准,但总的来说,某些对象具有某些属性而其他对象不具有某些属性是可以的。例如,假设一个支付系统返回一个抽象事件,该事件可能有也可能没有关联的发票。

关于c# REST API 多态返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45056110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com