2017-07-13 14 views
0

我想採用下面顯示的ResultSet類並對其進行修改,使其可以是通用的。正如你所看到的,它只接受產品列表,但爲了我的控制器中的代碼可重用性,我希望它採用List-OneOfMyModels>或List-T>。我如何參加一個課程並允許方法接受通用列表

public class ResultSet 
{ 
    public List<Product> GetResult(string search, string sortOrder, int start, int length, List<Product> dtResult, List<string> columnFilters) 
    { 
     return FilterResult(search, dtResult, columnFilters).SortBy(sortOrder).Skip(start).Take(length).ToList(); 
    } 

    public int Count(string search, List<Product> dtResult, List<string> columnFilters) 
    { 
     return FilterResult(search, dtResult, columnFilters).Count(); 
    } 

    private IQueryable<Product> FilterResult(string search, List<Product> dtResult, List<string> columnFilters) 
    { 
     IQueryable<Product> results = dtResult.AsQueryable(); 

     results = results.Where(p => (search == null || (p.Name != null && p.Name.ToLower().Contains(search.ToLower()) || p.PublicDisplayNo != null && p.PublicDisplayNo.ToLower().Contains(search.ToLower()))) 
      ); 

     return results; 
    } 
} 

在我控制我打電話像這樣的方法:

public JsonResult DataHandler(DTParameters param) 
    { 
     try 
     { 
      var dtsource = _context.Products.ToList(); 

      List<String> columnSearch = new List<string>(); 

      foreach (var col in param.Columns) 
      { 
       columnSearch.Add(col.Search.Value); 
      } 

      List<Product> data = new ResultSet().GetResult(param.Search.Value, param.SortOrder, param.Start, param.Length, dtsource, columnSearch); 
      int count = new ResultSet().Count(param.Search.Value, dtsource, columnSearch); 
      DTResult<Product> result = new DTResult<Product> 
      { 
       draw = param.Draw, 
       data = data, 
       recordsFiltered = count, 
       recordsTotal = count 
      }; 
      return Json(result); 
     } 
     catch (Exception ex) 
     { 
      return Json(new { error = ex.Message }); 
     } 
    } 
+0

public List getResult (params ....,List dtResult,param)。必須使該方法通用才能將通用列表作爲參數傳遞。您也可以返回列表。 –

回答

0

這應該讓你去:

using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices.ComTypes; 

public class ResultSet 
{ 
    public List<T> GetResult<T>(string search, string sortOrder, int start, int length, List<T> dtResult, List<string> columnFilters) where T : class 
    { 
     return FilterResult(search, dtResult, columnFilters).OrderBy(sortOrder).Skip(start).Take(length).ToList(); 
    } 
    public int Count<T>(string search, List<T> dtResult, List<string> columnFilters) where T : class 
    { 
      return FilterResult(search, dtResult, columnFilters).Count(); 
    } 

    private IQueryable<T> FilterResult<T>(string search, List<T> dtResult, List<string> columnFilters) where T : class 
    { 
     IQueryable<T> results = dtResult.AsQueryable(); 

     results = results.Where(p => (search == null || (p.Name != null && p.Name.ToLower().Contains(search.ToLower()) || p.PublicDisplayNo != null && p.PublicDisplayNo.ToLower().Contains(search.ToLower())))); 

     return results; 
    } 
} 

,你正在使用的屬性這將不支持的情況下在泛型類型T上,因爲我只輸入它作爲一個類。您可以按照文檔here更改打字。您需要使用基類或界面來鍵入它以使p.Name等工作正常工作。

+0

在編譯時,編譯器不會接受FilterResult 方法。編譯器將無法解析泛型類型的屬性值。 – devTimmy

+0

@devTimmy,是的。這是爲了讓你開始,我需要更多地瞭解你的模型以提供完整的答案。重讀底部的註釋。如果你有基類或接口,那麼你輸入T即可。基類或接口應該在FilterResult中包含要重用的成員。看看我分享的文檔鏈接。這應該讓剩下的路程。 – rkralston

0

你將不得不使整個通用像public class ResultSet<T>或使該類中的方法具有通用輸入和返回類型,如public List<T> GetResult(params)

但是,這引入了一個新的問題,在過濾結果方法中使用實際的Products類來執行搜索和過濾的屬性。使用Reflections in c#, System.Reflection查找通用類型的類屬性值。

相關問題