B12*_*ter 3 c# generics reflection asp.net-core-mvc asp.net-core
我的问题
是否有可能以某种方式T
从附加到此泛型类中方法的方法属性中访问泛型类的类型参数?
一个例子
例如,说我有一个通用控制器MyBaseController
处理T
由子控制器扩展的某种资源类型MyChildController
。
public class MyChildController : MyBaseController<BlogPost>
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在使用Swagger记录我的API,更具体地说是Swashbuckle,因此,我要使用ProducesResponseType注释我的操作以指定操作的返回类型。这很复杂,因为ProducesResponseType
需要一个Type
表示操作返回值的类的参数。
public abstract class MyBaseController<T> : Controller where T : IResource
{
[HttpGet, ProducesResponseType(T)] // <-- DOESN'T WORK!
public async Task<IActionResult> doSomething()
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我需要T
以某种方式解决typeof(BlogPost)
有什么想法,还是不可能?
无法访问属性中的泛型。
考虑替代方法
ASP.NET Core Web API中的参考控制器操作返回类型
ASP.NET Core 2.1引入了
ActionResult<T>
Web API控制器操作的返回类型。它使您能够返回派生自ActionResult
特定类型的类型或返回特定类型。
public abstract class MyBaseController<T> : Controller where T : IResource {
[HttpGet]
public async Task<ActionResult<T>> doSomething() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
正是出于这个目的而创造的
ActionResult<T>
与该IActionResult
类型相比,具有以下优点 :
- 该
[ProducesResponseType]
属性的Type
属性可以被排除。- 隐式转换运营商支持的转换
T
和ActionResult
到ActionResult<T>
。T
转换为ObjectResult
,表示return new ObjectResult(T);
简化为return T;
。
归档时间: |
|
查看次数: |
950 次 |
最近记录: |