调用泛型方法而不显式指定类型参数
Posted
技术标签:
【中文标题】调用泛型方法而不显式指定类型参数【英文标题】:Call a generic method without explicitly specifying the type-arguments 【发布时间】:2015-08-24 10:02:56 【问题描述】:我的控制器有以下处理程序:
protected ActionResult HandleRequest<TRequest, TResponse, TViewModel>(Func<TRequest, TResponse> function, TRequest request)
where TRequest : BaseRequest
where TResponse : BaseResponse<TViewModel>
where TViewModel : BaseViewModel
var viewData = function(request);
return View(viewData);
目前叫什么
return HandleRequest<HomeIndexGetRequest, HomeIndexGetResponse, HomeIndexGetViewModel>(GetData, request);
在我的控制器中。 GetData 方法看起来像
private static HomeIndexGetResponse GetData(HomeIndexGetRequest request)
return new HomeIndexGetResponse
ViewModel = new HomeIndexGetViewModel()
;
HomeIndexGetResponse
签名是
public class HomeIndexGetResponse : BaseResponse<HomeIndexGetViewModel>
BaseResponse
的设置类似于
public abstract class BaseResponse<TViewModel> where TViewModel : BaseViewModel
问题:有没有机会在不明确指定类型参数的情况下调用 HandleRequest?
return HandleRequest(GetData, request);
【问题讨论】:
如果你尝试会发生什么?编译器做了一些类型推断,但放弃了多层。 无法从用法中推断方法“ActionResult MvcApplication1.Controllers.MasterController.HandleRequest玩了一下,我想出了以下解决方案,可以根据需要使用。
新的非泛型基类
public abstract class BaseResponse
将 BaseResponse 更改为
public abstract class BaseResponse<TViewModel> : BaseResponse where TViewModel : BaseViewModel
处理程序更改为
protected ActionResult HandleRequest<TRequest, TResponse>(Func<TRequest, TResponse> function, TRequest request)
where TRequest : BaseRequest
where TResponse : BaseResponse
var viewData = function(request);
return View(viewData);
没有 TViewModel 类型参数。
最后,控制器是这样的
return HandleRequest(GetData, request);
在action中,实现了GetData
private static BaseResponse GetData(HomeIndexGetRequest request)
return new HomeIndexGetResponse
ViewModel = new HomeIndexGetViewModel()
;
【讨论】:
以上是关于调用泛型方法而不显式指定类型参数的主要内容,如果未能解决你的问题,请参考以下文章