2017-07-13 35 views
0

以下に示すResultSetクラスをとり、ジェネリックになるように修正したいと思います。表示されているように、これはProduct Listのみを受け入れますが、コントローラのコード再利用性のために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

公開リスト getResult (params ....、List dtResult、param)。ジェネリックList をパラメータとして渡すには、このメソッドをgenericにする必要があります。リストも返すことができます。 –

答えて

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を使用します。

関連する問題