【问题标题】:Can you use generic methods in a controller?你可以在控制器中使用泛型方法吗?
【发布时间】:2016-02-19 12:38:43
【问题描述】:

控制器中是否可以有一个通用方法?我说的是这样的事情:

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

我实际上已经尝试了上述方法(尽管所有内容都使用不同的名称)并在请求正文中使用 someGenericObject&lt;T&gt; 的实例发布到 Api/&lt;controllername&gt;/DoSomething,但它不起作用(即它没有到达控制器)。

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

那么,控制器中是否可以有一个泛型方法?

  • 如果是,怎么做?
  • 如果不是,为什么?

【问题讨论】:

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


【解决方案1】:

“排序”是这里的答案。对于泛型,您最终必须在 somewheresome point 定义基础类型,否则这一切都只是理论上的。 Web API 或 MVC 如何将您的请求中的数据(即 QueryString GET 或 FormData POST 键值对)路由到泛型类型并自动推断预期类型?这不可以。您可以做的是在控制器上创建一个私有泛型方法,但让控制器的操作方法解析为传递给私有泛型方法的具体类型。

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

【讨论】:

  • 您的第一个建议是我最初的想法,但我想看看通用控制器方法是否真的可行。我认为 Web API 可以只使用方法的名称,但我知道它实际上也将查询字符串/正文数据与参数匹配,而泛型是不可能的。
  • @Gigi 并非不可能。它只需要您以某种方式指定具体类型并对其进行解释。寻找具体类型作为 URL、QueryString 或 FormData 一部分的自定义控制器工厂可以工作,但对我来说感觉有点“hacky”。​​
  • 是的,这对我的需要来说太过分了。我可以为每种类型指定一个方法,并在内部使用泛型。
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2011-12-27
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
相关资源
最近更新 更多