调用泛型方法而不显式指定类型参数

本文关键字:类型参数 泛型方法 调用 | 更新日期: 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()
        };
}