0

Ich möchte die unten gezeigte ResultSet-Klasse nehmen und sie so ändern, dass sie generisch sein kann. Wie Sie sehen können, akzeptiert es nur die Produktliste, aber ich möchte, dass es List-OneOfMyModels> oder List-T> zur Wiederverwendbarkeit des Codes in meinen Controllern verwendet.Wie kann ich eine Klasse nehmen und zulassen, dass die Methoden eine generische Liste akzeptieren

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

Und in meinem Controller nenne ich das Verfahren wie folgt:

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

öffentliche Liste getResult (Parameter ...., Liste dtResult, param). Sie müssen die Methode generisch machen, um die generische Liste als Parameter zu übergeben. Sie können auch die Liste zurückgeben. –

Antwort

0

Dies sollte man losgeht:

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

Dadurch werden die Fälle nicht unterstützen, in denen Sie Eigenschaften verwenden auf den generischen Typ, T, weil ich es nur als Klasse eingegeben habe. Sie können die Eingabe entsprechend der Dokumentation here ändern. Sie sollten es mit einer Basisklasse oder einer Schnittstelle eingeben, um Dinge wie p.Name zum Laufen zu bringen.

+0

Die Methode FilterResult wird vom Compiler zur Kompilierzeit nicht einmal akzeptiert. Der Compiler kann keine Eigenschaftswerte von generischen Typen auflösen. – devTimmy

+0

@devTimmy, ja. Dies ist, um zu beginnen, ich würde mehr über Ihre Modelle wissen müssen, um eine vollständige Antwort zu geben. Lies die Notiz unten neu. Wenn Sie eine Basisklasse oder eine Schnittstelle haben, geben Sie T ein. Die Basisklasse oder Schnittstelle sollte die Mitglieder haben, die Sie in FilterResult wiederverwenden möchten. Sehen Sie sich den Dokumentationslink an, den ich geteilt habe. Das sollte den Rest des Weges dorthin bringen. – rkralston

0

Sie müssten die gesamte generische wie public class ResultSet<T> machen oder die Methoden in der Klasse haben generische Eingabe und Rückgabetypen wie so.

Aber dies führt ein neues Problem in der Filter-Ergebnis-Methode, die die tatsächliche Products Klasse verwendet, um Suche und Filter nach seinen Eigenschaften durchzuführen. Verwenden Sie , um Klasseneigenschaftswerte generischer Typen nachzuschlagen.

Verwandte Themen