调用泛型方法而不显式指定类型参数
本文关键字:类型参数 泛型方法 调用 | 更新日期: 2023-09-27 18:09:43
我的控制器基有以下处理程序:
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);
玩了一会儿,我想出了下面的解决方案,我需要它。
新的非泛型基类
public abstract class BaseResponse
将baserresponse更改为
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);
在动作中,GetData
被实现
private static BaseResponse GetData(HomeIndexGetRequest request)
{
return new HomeIndexGetResponse
{
ViewModel = new HomeIndexGetViewModel()
};
}