ASP.NET Core Web API中,有时候我们会使用抽象类作为Web API的路由处理参数类型,以便在不同的控制器中重用一些代码。 但是,当我们尝试从请求中绑定值到抽象类中的属性时,会抛出“无法创建抽象类”的异常。
为了解决这个问题,我们可以使用自定义的模型绑定器绑定请求中的值到抽象类的属性中。具体步骤如下:
public class AbstractClassModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
// 绑定抽象类型的属性逻辑
var abstractType = bindingContext.ModelType;
// 检查类型是否是抽象类,或者是否拥有无参的默认构造函数
if (abstractType.IsAbstract || abstractType.GetConstructor(Type.EmptyTypes) == null)
{
bindingContext.Result = ModelBindingResult.Failed();
return Task.CompletedTask;
}
// 创建抽象类型的实例
var instance = Activator.CreateInstance(abstractType);
// 绑定请求中的值到抽象类型的属性
foreach (var property in abstractType.GetProperties())
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(property.Name);
if (valueProviderResult != ValueProviderResult.None)
{
var value = valueProviderResult.FirstValue ?? string.Empty;
// 将请求中的值转换为抽象类型的属性类型
var convertedValue =
TypeDescriptor.GetConverter(property.PropertyType).ConvertFromString(value);
// 给抽象类型的属性赋值
property.SetValue(instance, convertedValue);
}
}
bindingContext.Result = ModelBindingResult.Success(instance);
return Task.CompletedTask;
}