你能在控制器中使用泛型方法吗?

Gig*_*igi 10 c# generics asp.net-web-api

是否可以在控制器中使用通用方法?我在谈论这样的事情:

    [HttpPost]
    public void DoSomething<T>([FromBody] SomeGenericClass<T> someGenericObject)
    {
        SomePrivateMethod<T>(someGenericObject);
    }
Run Code Online (Sandbox Code Playgroud)

我实际上已经尝试了上面的内容(尽管所有内容都有不同的名称)并且在请求正文中发布Api/<controllername>/DoSomething了实例someGenericObject<T>,但它没有工作(即它没有到达控制器).

我猜测Web API路由无法解析泛型方法,因为它们可能导致下面不同类型的不同方法.但这就是我的想法.

那么,是否可以在控制器中使用通用方法?

  • 如果有,怎么样?
  • 如果没有,为什么?

Han*_*ney 10

"排序"就是这里的答案.使用泛型,你必须最终在某个地方某个时刻定义基础类型,否则它只是理论上的.Web API或MVC如何将请求中的数据(只是QueryString GET或FormData POST键值对)路由到泛型类型并自动推断出预期类型?这不可以.您可以做的是在控制器上创建一个私有泛型方法,但让控制器的Action Methods解析为传递给私有泛型方法的具体类型.

你也可以看看这个SO答案作为一种替代的,基于惯例的方法.假设您将通用控制器的具体类型指定为URL,QueryString或FormData的一部分,它应该可以很好地工作.

  • @Gigi并非不可能.它只需要您以某种方式指定具体类型并进行解释.寻找具体类型作为URL,QueryString或FormData的一部分的自定义控制器工厂可以工作,虽然对我来说有点"hacky". (2认同)