C# Web Api控制器方法中具体类的反序列化接口

C# Web Api控制器方法中具体类的反序列化接口,c#,asp.net,json.net,asp.net-web-api2,C#,Asp.net,Json.net,Asp.net Web Api2,我正在用asp.net编写一个web api。 我有以下问题: 我有一个接口和一个实现该接口的类 public interface Item { string Name { get; set; } string Description { get; set; } } public class ConcreteItem : ITem { public ConcreteItem() { } string Name { get; set; }

我正在用asp.net编写一个web api。 我有以下问题: 我有一个接口和一个实现该接口的类

public interface Item
{
    string Name { get; set; }
    string Description { get; set; }
}

public class ConcreteItem : ITem
{
    public ConcreteItem()
    {
    }
    string Name { get; set; }
    string Description { get; set; }
}
在我的控制器类中,我有以下方法

[HttpPost]
    public IHttpActionResult ByGivenItems([FromBody] IEnumerable<Item> items)
    {
      //Do something here
    }
[HttpPost]
按给定项([FromBody]IEnumerable items)列出的公共IHttpActionResult
{
//在这里做点什么
}
问题是当我将一些内容发送到webservice(json格式)时。 如果我有下面的签名,那么数组是空的

public IHttpActionResult ByGivenItems([FromBody] IEnumerable<Item> items)
public ihttpackationresult by givenitems([FromBody]IEnumerable items)
但是换成

public IHttpActionResult ByGivenItems([FromBody] IEnumerable<ConcreteItem> items)
public ihttpackationresult by givenitems([FromBody]IEnumerable items)
工作。 我应该怎么做才能让json转换器将其反序列化为正确的类型? 我是C#世界的新手,所以我需要一个很好的解释


我已经通过邮递员发送了一些数据对它进行了测试。

你希望它做什么?它无法创建
接口
的实例,您要求它将JSON反序列化为
IEnumerable
,而
无法实例化,这意味着它必须猜测可以实例化到哪个类
,如果有两个相同的
ConcreteItem
类,会发生什么?它如何选择使用哪一个?看起来非常相似。这回答了你的问题吗?我知道我需要序列化为具体类型。但我的问题是如何在asp.NETWebAPI系统中实现它,因为框架是所有工作的主要部分。我可以说将json converter转换为具体项,但保留givenitems([FromBody]IEnumerable items)方法的签名吗?链接的问题表明,
[JsonConverter]
属性可以应用于接口。您还可以将转换器添加到
序列化设置中,如中所示。@mimi您可以尝试查看自定义模型绑定。现在,按照惯例,控制器操作不应该以接口作为参数,原因与前面提到的相同,但是您可以使用模型绑定器,自己获取原始输入并反序列化它,您希望它做什么?它无法创建
接口
的实例,您要求它将JSON反序列化为
IEnumerable
,而
无法实例化,这意味着它必须猜测可以实例化到哪个类
,如果有两个相同的
ConcreteItem
类,会发生什么?它如何选择使用哪一个?看起来非常相似。这回答了你的问题吗?我知道我需要序列化为具体类型。但我的问题是如何在asp.NETWebAPI系统中实现它,因为框架是所有工作的主要部分。我可以说将json converter转换为具体项,但保留givenitems([FromBody]IEnumerable items)方法的签名吗?
链接的问题表明,
[JsonConverter]
属性可以应用于接口。您还可以将转换器添加到
序列化设置中,如中所示。@mimi您可以尝试查看自定义模型绑定。现在,按照惯例,控制器操作不应该以接口作为参数,原因与前面提到的相同,但是您可以使用模型绑定器,自己获取原始输入并反序列化它