Как я могу сделать этот метод C # универсальным? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть класс ниже, который используется для проверки, если пользователь отправляет запрос 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;
        }
    }
}

1 Ответ

0 голосов
/ 04 мая 2018

Автор на мобильном телефоне, может не компилироваться, но должен указывать правильное направление.

using System;
using System.Web.Http.Controllers;
using System.Web.Http.ModelBinding;
using Models.Requests;
using Newtonsoft.Json;

namespace MyCorp.Api
{
    public class CustomModelBinder<T> : IModelBinder
    {
        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            var settings = new JsonSerializerSettings
            {
                MissingMemberHandling = MissingMemberHandling.Error
            };

            try
            {
                bindingContext.Model =
                    JsonConvert.DeserializeObject<T>(
                    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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...