如何通过泛型 Func 返回 JsonResult
本文关键字:返回 JsonResult 何通过 泛型 Func | 更新日期: 2023-09-27 18:31:48
有一个使用基方法的操作,该方法需要 Func
public class HomeController: BaseController
{
public JsonResult HomeController()
{
var model = ExecuteHandledJTableJsonOperation(() =>
{
//do some stuff
}, LocalResources.CommonErrorMessage);
return Json(model);
}
}
以及期望 Func 的基本方法
public class BaseController : Controller
{
public T ExecuteHandledJTableJsonOperation<T>(Func<T> actionToExecute, string errorMessage)
{
try
{
return actionToExecute.Invoke();
}
catch (Exception ex)
{
LogEntry entry = new LogEntry();
entry.AddErrorMessage(ex.Message);
entry.AddErrorMessage(String.Format("Inner Exception:", ex.InnerException.Message));
//entry.Message = ex.Message;
entry.Priority = 1;
entry.EventId = 432;
entry.Severity = System.Diagnostics.TraceEventType.Error;
writer.Write(entry);
return Json(new { Result = "ERROR", Message = errorMessage });
}
}
}
当我尝试返回 Json 时,它会检索到一个错误(new { 结果 = "错误",消息 = 错误消息 });
无法将类型"System.Web.Mvc.JsonResult"隐式转换为"T"
我知道如果我创建期望两个操作的ExecuteHandledJTableJsonOperation
覆盖会更好,一个用于正常执行/返回,另一个在操作超出时执行。
像这样:
return ExecuteHandledJTableJsonOperation(() =>
{
//do something
return Json(new { Result = "OK", Records = excepciones, TotalRecordCount = excepciones.Count() });
}, () =>
{
return Json(new { Result = "ERROR", Message = Properties.Resources.CommonErrorMessage });
});
但是我想知道如何解决第一种情况:无法将类型"System.Web.Mvc.JsonResult"隐式转换为"T"
谢谢。
目前还不完全清楚为什么您的方法是通用的,因为您似乎希望始终返回一个JsonResult
因此只需将您的方法更改为此方法即可。
public class BaseController : Controller
{
public JsonResult ExecuteHandledJTableJsonOperation<T>(Func<JsonResult> actionToExecute, string errorMessage)
{
try
{
return actionToExecute.Invoke();
}
catch (Exception ex)
{
LogEntry entry = new LogEntry();
entry.AddErrorMessage(ex.Message);
entry.AddErrorMessage(String.Format("Inner Exception:", ex.InnerException.Message));
//entry.Message = ex.Message;
entry.Priority = 1;
entry.EventId = 432;
entry.Severity = System.Diagnostics.TraceEventType.Error;
writer.Write(entry);
return Json(new { Result = "ERROR", Message = errorMessage });
}
}
}
我想你不需要它是如此通用。如果您仅在操作中使用它,则可以返回ActionResult
作为派生JsonResult
。认为在您的情况下添加操作结果的约束就足够了:
public T ExecuteHandledJTableJsonOperation<T>(Func<T> actionToExecute, string errorMessage)
where T: ActionResult
{
//code
}