如何通过泛型Func <t>返回JsonResult?</t>

时间:2014-11-25 12:00:24

标签: c# asp.net-mvc generics delegates func

使用一个使用期望Func

的基本方法的Action
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 {Result =“ERROR”,Message = errorMessage});

无法将类型'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'
感谢。

2 个答案:

答案 0 :(得分:0)

为什么您的方法是通用的并不完全清楚,因为您似乎总是要返回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 });
        }
    }
}

答案 1 :(得分:0)

我想你不需要那么太通用了。如果您仅在操作中使用该功能,则可以ActionResult derived from it返回JsonResult。认为在您的情况下添加ActionResult的constraint就足够了:

public T ExecuteHandledJTableJsonOperation<T>(Func<T> actionToExecute, string errorMessage) 
    where T: ActionResult
{
    //code
}