现在,我们的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
编译错误,我不知道为什么。请指教。
答案 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
而不是某种价值。