我创建了具有继承性的数据协定如下:-
[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>
并且任务不是协变的。也就是说,即使Dog
是Animal
,Task<Dog>
也不是Task<Animal>
。
你能做什么?
-
将您的代码更改为
case "dog": Animal dog = GetDogDetails(); return Task.FromResult(dog); break;
不过,您将失去狗的特定属性。
-
杠杆
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 标准,这种多态响应也是一件好事。
我不知道形式标准,但一般来说,某些对象具有某些属性而其他对象不具有某些属性是可以的。例如,想象一个支付系统返回一个抽象的事件,该事件可能有也可能没有与之关联的发票。