如何通过泛型 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"
谢谢。

如何通过泛型 Func<T> 返回 JsonResult

目前还不完全清楚为什么您的方法是通用的,因为您似乎希望始终返回一个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
}