C# 在C语言中传递函数参数时出错#
现在,MVC web应用程序上的用户可以对服务器进行大量ajax调用。目前,我们正在唯一地处理它们,而没有全局包装器/处理程序方法。我想改变这一点,但我对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
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." } };
}
}