У меня есть класс ниже, который используется для проверки, если пользователь отправляет запрос API с недопустимым свойством. Я хотел бы сделать этот класс общим. Например, я хотел бы использовать этот класс в общем случае для любого типа объекта запроса. Например, UserSearchRequest, GroupSearchRequest, XSearchRequest и т. Д.
Первоначально я явно установил тип для DeserializeObject равным UserSearchRequest, который работал, как и ожидалось, но сейчас я пытаюсь обобщить эту реализацию. Я попытался предоставить T для подписи BindModel (), но для поддержки интерфейса IModelBinder требуется текущая подпись.
Моя текущая мысль - иметь конструктор класса, который принимает параметр Type, который затем устанавливает его в переменную-член, на которую затем ссылаются в методе BindModel. Но я не могу заставить это работать. Что я тут не так делаю?
using System;
using System.Web.Http.Controllers;
using System.Web.Http.ModelBinding;
using Models.Requests;
using Newtonsoft.Json;
namespace MyCorp.Api
{
public class CustomModelBinder : IModelBinder
{
Type _bindModelType;
public CustomModelBinder(Type bindModelType)
{
_bindModelType = bindModelType;
}
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var settings = new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error
};
try
{
bindingContext.Model =
JsonConvert.DeserializeObject<_bindModelType.GetType()>(
actionContext.Request.Content.ReadAsStringAsync().Result,
settings);
}
catch (Exception ex)
{
var split = ex.Message.Split("'".ToCharArray());
var message = "{0}.{1} is not a valid property";
var formattedMessage = string.Format(message, split[3], split[1]);
bindingContext.ModelState.AddModelError("extraProperty", formattedMessage);
}
return true;
}
}
}