c# - 有什么方法可以让端点在带有 C# 的 WebAPI 中使用泛型?

标签 c# .net asp.net-core asp.net-web-api json.net

使用 .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/

相关文章:

.net - 医疗软件的 WPF 图表控件

javascript - 单击 .NET Core 中的单选按钮时,表单未提交

c# - .NET Core 2.1 上的 AWS Secrets Manager GetSecretValueAsync 套接字异常

c# - 为什么 C# 允许通过可选参数进行不明确的函数调用?

c# - 旋转 log4net 不会重写相同的日志文件

c# - 林克:{"Operation could destabilize the runtime."}

.net - 从 WCF REST Web 服务返回包装在回调函数中的 JSON

.net - T4 用于在 LLBLGen Pro 实体上生成 POCO?

c# - 更新库配置以使用 ASP.NET Core

c# - 打开从 C# 创建的 xlsx 时出现 Excel "found unreadable content"错误