使用 .net 核心和牛顿 JSON。我可以有一个使用泛型的端点吗?我应该如何请求它传递通用类型?
public async Task<JsonResult> SaveSetting<T>([FromBody] Filter<T> model)
{}
public class Filter<T>
{
public string GUID { get; set; }
public string Name { get; set; }
public FilterType FilterType { get; set; }
public T FilterRequestModel { get; set; }
}
最佳答案
不太可能有简单的方法来完成这项工作,如果有的话。更重要的是,这是非常不可取的。大概您需要根据 UI 的输入确定 T
应该是什么类型,然后您将使用 JSON 绑定(bind)将值绑定(bind)到该类型。这意味着您将允许调用者(您不能信任的人)使您的代码实例化并在他们选择的 C# 类型上设置属性,这代表 a security vulnerability .
很有可能您可以让此端点在没有泛型的情况下执行您想要的操作:只需使用 JObject 作为 FilterRequestModel 对象。如果你真的依赖实际的 C# 类型来完成你想要的,你仍然最好让你的 Controller 操作使用 JObject
,并使用一些自定义逻辑根据一些用户输入来转换它,在检查指定的类型是否是您希望调用者能够实例化的类型之后。一旦创建了自定义类型的对象,就可以在将其传递给通用辅助方法之前将其转换为 dynamic
,并且通用类型将在运行时自动解析为对象的类型你创造了。
public async Task<JsonResult> SaveSetting([FromBody] Filter<JObject> model)
{
Type filterRequestModelType = this.DetermineSafeModelType(model);
object typedFilterRequestModel = model.FilterRequestModel.ToObject(filterRequestModelType);
return SaveSettingHelper(model, (dynamic) typedFilterRequestModel);
}
public async Task<JsonResult> SaveSetting<T>([FromBody] Filter<JObject> model, T filterRequestModel) {...}
关于c# - 有什么方法可以让端点在带有 C# 的 WebAPI 中使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59939405/