カスタムモデルバインダーを使用すると、これをかなり簡単に行うことができます。これが私のために働いたものです。(Web API2とJSON.Net6を使用)
public class JsonPolyModelBinder : IModelBinder
{
readonly JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var content = actionContext.Request.Content;
string json = content.ReadAsStringAsync().Result;
var obj = JsonConvert.DeserializeObject(json, bindingContext.ModelType, settings);
bindingContext.Model = obj;
return true;
}
}
WebAPIコントローラーは次のようになります。(注:通常のMVCアクションでも機能するはずです-私は以前にもこのようなことをしました。)
public class TestController : ApiController
{
// POST api/test
public void Post([ModelBinder(typeof(JsonPolyModelBinder))]ICommand command)
{
...
}
}
また、JSONをシリアル化するときは、同じ設定でシリアル化し、自動を開始してタイプヒントを含めるためのインターフェイスとしてシリアル化する必要があることにも注意してください。このようなもの。
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
string json = JsonConvert.SerializeObject(command, typeof(ICommand), settings);