2014-11-25 49 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 
}