C#中的函数参数传递问题

问题描述:

现在,我们的MVC Web应用程序中的用户可以对服务器进行一堆Ajax调用。目前我们正在处理它们都是唯一的,没有全局包装器/处理器方法。我想改变这种情况,但我没有太多关于C#中函数委托的经验。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

任何使用“对象”的泛型类型参数都会违反使用泛型的要点。 – Oded 2013-02-13 20:43:01

+1

@Oded在这种情况下,你建议使用什么呢?你会建议他创建一个自己的委托类型来接受一个对象并返回一个对象,因为如果他做了,我建议他使用'Func'来代替。 – Servy 2013-02-13 20:45:39

+0

@Servy - 不确定泛型在这里是正确的答案。 – Oded 2013-02-13 20:46:44

我建议改变你的方法,以便它是通用的,而不是仅仅使用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而不是某个值。