c# - 我怎样才能使这个 c# 方法通用?
问题描述
我有下面的类,用于验证用户是否提交了带有无效属性的 API 请求。我想让这个类通用。例如,我想将这个类与任何类型的请求对象一起使用。例如,UserSearchRequest、GroupSearchRequest、XSearchRequest 等。
我最初明确地将 DeserializeObject 的类型设置为 UserSearchRequest ,它按预期工作,但现在我正在尝试泛化这个实现。我尝试为 BindModel() 签名提供 T,但需要当前签名才能支持 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;
}
}
}
解决方案
在移动设备上创作,可能无法编译,但应该为您指明正确的方向。
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;
}
}
}
推荐阅读
- python - Asyncio aiohttp 从 URL 列表中填充 HTML 列表
- reactjs - 记录嵌入了 React 的 Bootstrap 应用程序
- apache-spark - 如何在没有熊猫帮助的情况下使用 pyspark 读取 xlsx 文件
- powershell - 使用 PowerShell 查找上次修改时间在当前 sysdate/time 之前 30 的文件
- r - 创建一个迭代函数,当它在 r 中为真时停止
- discord - 当多个用户使用该命令时 fs.writeFile 不更新
- c# - 无法连接到 MySQL 服务器并且不知道为什么
- clojure - Clojure:将字符串转换为函数
- python - 创建依赖于另一个属性的类属性而不覆盖
- javascript - 如何在反应导航 5 中的选项卡导航器中的选项卡屏幕之间移动?