c# REST API 多态返回类型



我创建了具有继承性的数据协定如下:-

[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:
}
}

我无法返回相应的动物类型。我收到以下错误:- "不能隐式地将狗转换为动物"。

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

您收到此错误的原因是您返回了一个Task<T>并且任务不是协变的。也就是说,即使DogAnimalTask<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它。我认为您不应该担心当前代码中的任务。

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

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

最新更新