2014-11-25 194 views
0

拥有使用该预期函数求如何通过泛型函数返回JsonResult <T>?

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检索我一个错误的基础方法的基础方法(新{的行动结果=“错误”,消息= 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”
谢谢。

回答

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 }); 
     } 
    } 
} 
0

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

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