在C#中传递函数参数时出现问题

时间:2013-02-13 20:42:04

标签: c# asp.net-mvc

现在,我们的MVC网络应用程序上的用户可以对服务器进行一堆ajax调用。目前我们在没有全局包装器/处理程序方法的情况下全部处理它们。我想改变这一点,但我对C#中的函数委托没有多少经验。

理想情况下,我希望它的设计如下:

public class GenericService
{
    public PageViewModel EditPage(PageViewModel model)
    {
        ....
    }

    public JsonResult JsonAjaxRequest(Func<Object, Object> serviceCall, Object data)
    {
        try
        {
            return new JsonResult() { Data = new { status = "ok", data = serviceCall(data) } };
        }
        catch
        {
            return new JsonResult() { Data = new { status = "error", message = "The server encountered an unknown error." } };
        }
    }

现在在我的控制器中,我有以下代码:

private readonly GenericService _service;

public JsonResult PageEdit(PageViewModel model)
{
    return Json(_service.JsonAjaxRequest(x=>_service.EditPage(model), model));
}

我一直收到cannot convert from method group to system.func<object, object>错误和invalid arguments编译错误,我不知道为什么。请指教。

1 个答案:

答案 0 :(得分:2)

我建议您更改方法,使其成为通用方法,而不是仅仅在任何地方使用object

public JsonResult JsonAjaxRequest<TIn, TOut>(Func<TIn, TOut> serviceCall, TIn data)
{
    try
    {
        return new JsonResult() { Data = new { status = "ok", data = serviceCall(data) } };
    }
    catch
    {
        return new JsonResult() { Data = new { status = "error", message = "The server encountered an unknown error." } };
    }
}

使用此参数可以根据您提供的lambda或方法组作为参数推断泛型参数。对于lambda来说,它应该不是问题,但是当直接传递方法组时,它可以帮助处理一些边缘情况。它还意味着您为函数提供的参数是强类型的,因此您无需强制转换它。

如果您使用的方法要么接受除一个以外的一些参数(即零或2+)或者如果它返回,那么您可以获得编译器错误(如您在进行此更改后提到的那个)的唯一方法void而不是某种价值。