【发布时间】:2017-07-12 11:13:44
【问题描述】:
我创建了如下具有继承性的数据合约:-
[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 标准,这种多态响应也是一件好事。
【问题讨论】:
-
无论如何,这是一个可怕的错误信息。
-
如果您使用 JSON,请忘记数据合约的噩梦,只需从控制器返回
dynamic。然后您可以返回任何内容,并将其序列化(尽可能)给客户端。 -
@zaitsman 如果需要,我不建议使用动态响应,如 VladStryapko 在他的回答中所说的那样使用 IHttpActionResult。
-
@FilipCordas 为什么? Ihttpactionresult 要求您将响应包装在对
this.Ok()和类似的调用中。这是不必要的代码混乱。无论如何,您的单元测试应该确保行为。这种方法的唯一限制是默认的 xml 序列化无法解决这个问题。但我过去在商业上使用它非常成功。 -
@zaitsman 这是一种观点,但对我来说,这只是尖叫缺乏架构。
dynamic的返回等效于从控制器返回一个object。假设有人服用case:1 return new { A="" }; case 2 : return Ok(new { A="" });这将编译并返回相同的 JSON 值。并且编译时异常总是比运行时更好。
标签: c# inheritance asp.net-web-api polymorphism response