C# 在C语言中传递函数参数时出错#

C# 在C语言中传递函数参数时出错#,c#,asp.net-mvc,C#,Asp.net Mvc,现在,MVC web应用程序上的用户可以对服务器进行大量ajax调用。目前,我们正在唯一地处理它们,而没有全局包装器/处理程序方法。我想改变这一点,但我对C#中的函数委托没有太多经验 理想情况下,我希望它的设计如下: public class GenericService { public PageViewModel EditPage(PageViewModel model) { .... } public JsonResult JsonAjax

现在,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." } };
        }
    }

我一直收到一个
无法从方法组转换到system.func
错误和一个
无效参数
编译错误,我不确定原因。请提供建议。

我建议更改您的方法,使其成为通用方法,而不是到处使用
对象:

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." } };
    }
}
publicjsonresult-JsonAjaxRequest(Func-serviceCall,TIn数据)
{
尝试
{
返回新的JsonResult(){Data=new{status=“ok”,Data=serviceCall(Data)};
}
抓住
{
返回new JsonResult(){Data=new{status=“error”,message=“服务器遇到未知错误。”};
}
}
使用此方法,可以根据作为参数提供的lambda或方法组推断泛型参数。对于lambda来说,这不应该是一个问题,但是当直接传入方法组时,它可以帮助处理一些边缘情况。这还意味着您提供给函数的参数是强类型的,因此不需要强制转换它


进行此更改后,如果您使用的方法接受的参数不是一个(即零或2+),则可能会出现类似您提到的编译器错误或者如果它返回
void
而不是某个值。

任何使用
Object
的泛型类型参数都不能使用泛型。@Oded在这种情况下,您建议使用什么来代替?您是否建议他创建自己的委托类型,接受一个对象并返回一个对象,因为如果他这样做了,我建议他使用
Func
。@Jay,我不能复制这个问题。你确定这就是你正在使用的代码吗?你能添加将方法组参数传递给
JsonAjaxRequest
的代码以及方法的类型吗?我看不出你引用的错误是哪一行给出的。您正在使用
Func
type。要使方法与之兼容,该方法必须接受一个参数,该参数必须是
对象
(在
对象
上没有基类或接口,因此它必须是
对象
)。它必须返回一些东西(不是
void
),它必须是一个可以转换为
Object
的类型,但是所有类型都可以转换为
Object
,因此对返回类型没有限制(除非它不能像我说的那样是
void
)。编辑:但返回类型不能是值类型。
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." } };
    }
}