有没有办法在带有 C# 的 WebAPI 中使用泛型来使用端点?

Posted

技术标签:

【中文标题】有没有办法在带有 C# 的 WebAPI 中使用泛型来使用端点?【英文标题】:Is there any way to have an endpoint using generics in a WebAPI with C#? 【发布时间】:2020-05-13 07:36:13 【问题描述】:

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

【问题讨论】:

您必须为此构建自己的模型绑定器。一种根据数据确定要构建的类型。 你知道我可以在哪里找到样品吗? 您希望它如何工作?您不在运行时解析泛型,而是在编译时解析它们。您只需将类型 T 替换为 JObject。 就像@DavidL 说的那样。直接接受 JSON。 @Nestorzin 模型活页夹不起作用。您仍然必须提供泛型类型 somewhere 才能编译您的代码。在您的示例中,您期望从永远不会编译的客户端发送的类型,无论是否建模绑定器。模型绑定器允许您声明一个泛型类型模型,然后在每个站点进行强类型化。您的示例中没有类似的内容。如果您想使用模型绑定器来封装您当然可以的反序列化,然后该模型将可以跨多个端点使用,但这会破坏您的示例。 【参考方案1】:

如果有办法的话,不太可能有 简单 的方法来完成这项工作。更重要的是,这将是非常不可取的。大概您需要根据来自 UI 的输入确定 T 应该是什么类型,然后您将使用 JSON 绑定将值绑定到该类型。这意味着您将允许调用者(您不能信任的调用者)使您的代码实例化并在他们选择的 C# 类型上设置属性,这表示 a security vulnerability。

很有可能您可以在没有泛型的情况下使此端点做您想做的事情:只需使用 JObject 作为 FilterRequestModel 对象。如果你真的依赖实际的 C# 类型来完成你想要的,你最好让你的控制器操作使用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) ...

【讨论】:

感谢您帮助我。我正在考虑摆脱任何泛型类型并拥有这样的模型:public class Filter public string GUID get; set; public string Name get; set; public FilterType FilterType get; set; public JObject FilterRequestModel get; set; 你怎么看? 我认为这是个好主意。

以上是关于有没有办法在带有 C# 的 WebAPI 中使用泛型来使用端点?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# WebAPI 中,如何配置 CORS 以允许带有凭据和 json 内容的 POST 请求?

带有泛型的 C# 不寻常的继承语法

使用带有备用内容类型的 c# web api

C#基础篇——泛型

如果类型在运行时之前未知,您可以在 C# 中使用泛型方法吗?

C#之泛型