你能在控制器中使用通用方法吗

本文关键字:方法 控制器 | 更新日期: 2023-09-27 18:00:39

控制器中是否可以有一个泛型方法?我说的是这样的东西:

    [HttpPost]
    public void DoSomething<T>([FromBody] SomeGenericClass<T> someGenericObject)
    {
        SomePrivateMethod<T>(someGenericObject);
    }

事实上,我已经尝试过上述操作(尽管所有操作都有不同的名称),并在请求体中使用someGenericObject<T>的实例发布到Api/<controllername>/DoSomething,但它不起作用(即它没有到达控制器)。

我猜Web API路由无法解析通用方法,因为它们可能会导致下面不同类型的不同方法。但这正是我的想法。

那么,有可能在控制器中使用通用方法吗?

  • 如果是,如何
  • 如果没有,为什么

你能在控制器中使用通用方法吗

这里的答案是"有点"。对于泛型,您最终必须在某个地方和某个点定义底层类型,否则这只是理论上的。Web API或MVC如何将请求中的数据(仅为QueryStringGET或FormDataPOST键值对)路由到泛型类型并自动推断预期类型?它不能。您可以在控制器上创建一个私有泛型方法,但将控制器的Action Methods解析为传递给私有泛型方法的具体类型。

您也可以将这个SO答案视为一种替代的、基于约定的方法。假设您将通用控制器的具体类型指定为URL、QueryString或FormData的一部分,那么它应该非常适合您。