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

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(Func, TRequest)”的类型参数。尝试明确指定类型参数。 【参考方案1】:

玩了一下,我想出了以下解决方案,可以根据需要使用。

新的非泛型基类

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()
        ;

【讨论】:

以上是关于调用泛型方法而不显式指定类型参数的主要内容,如果未能解决你的问题,请参考以下文章

关于泛型

模拟任何给定类型参数的泛型方法调用

详解C#泛型

泛型1

泛型与反射

Java泛型