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

时间:2014-04-29 14:18:14

标签: c# generics asp.net-web-api

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

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

我实际上已尝试过以上内容(虽然所有内容都有不同的名称)并在请求正文中使用Api/<controllername>/DoSomething的实例发布到someGenericObject<T>,但它不起作用(即它没有'到达控制器。)

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

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

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

1 个答案:

答案 0 :(得分:8)

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

您还可以take a look at this SO answer作为替代的基于约定的方法。假设您将通用控制器的具体类型指定为URL,QueryString或FormData的一部分,它应该可以很好地工作。