0

现在,我们的 MVC Web 应用程序上的用户可以对服务器进行大量 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编译错误,我不知道为什么。请指教。

4

1 回答 1

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而不是返回一些价值。

于 2013-02-13T21:18:52.157 回答