2017-05-18 9 views
0

Ich habe viele Beispiele für die Verwendung generischer Objekte in C# gesehen, aber kann ich eine generische Eigenschaft für ein statisches Objekt haben?C# - Methode mit generischer Eigenschaft

Ich habe 2 verschiedene Listen der Provider:

List<Providers> OldProviders 
List<Providers> NewProviders 

OldProviders Anbieter aus der Datenbank hat, und NewProviders hat Anbieter der Benutzer in der Ansicht ausgewählt hat. Wenn sich keine OldProvider in NewProviders befinden, möchte ich sie aus der Datenbank entfernen. Wenn sich keine NewProvider in OldProviders befinden, möchte ich sie zur Datenbank hinzufügen. Einfach.

Ein Problem: Provider hat zwei Eigenschaften, die für den Vergleich mit Fremdschlüssel wichtig entsprechen: StaffID und LicenseID (beide ganzen Zahlen) nach Wahl Je der Benutzer macht, habe ich nur über eine dieser IDs kümmern.

Momentan habe ich 2 Sätze von Hilfsmethoden, die völlig identisch sind (6 Helfer insgesamt), außer ob sie mit StaffID oder LicenseID vergleichen. Es funktioniert technisch, aber ich möchte es nicht aufrechterhalten.

Hier ist ein Beispiel:

private bool DeleteOldStaffProviders(List<Provider> oldSelectedStaff, List<Provider> newSelectedStaff) 
     { 
      foreach (var oldSelected in oldSelectedStaff) 
      { 
       bool remove = newSelectedStaff.SingleOrDefault(n => n.StaffID == oldSelected.StaffID) == null; 
       if (remove) 
       { 
        //<remove from database, return false if failure> 
       } 
      } 
      return true; 
     } 

Gibt es eine Weise, die ich diese Methode mit einer generischen Parameter Referenz neu schreiben kann? d.h.

newSelectedStaff.SingleOrDefault(n => n.T == oldSelected.T) 

wobei T entweder LicenseID oder StaffID.

Ich habe eine Menge Beispiele von Leuten gesehen, die LINQ und Reflektion für Dinge verwenden, die dem ähnlich sind, aber ich kann es nicht herausfinden. Wenn du mich damit durchträgst, wäre das geschätzt.

+0

Sie würden eine generische verwenden hier nicht in der Lage sein, Ihr Problem zu lösen, weil Generika verwendet werden, ein _type von angeben object_ ist unbekannt, aber Sie müssen eine _property eines Objekts_ angeben, das unbekannt ist. –

Antwort

2

Ja, verwenden Sie einen anderen Parameter des Typs Func<Provider,int> als Wähler zu handeln:

private bool DeleteOldStaffProviders(List<Provider> oldSelectedStaff, List<Provider> newSelectedStaff, Func<Provider,Provider,bool> selector) 
{ 
    foreach (var oldSelected in oldSelectedStaff) 
    { 
     bool remove = newSelectedStaff.SingleOrDefault(n => selector(n) == selector(oldSelected)) == null; 
     if (remove) 
     { 
      //<remove from database, return false if failure> 
     } 
    } 
    return true; 
} 

Nutzung

DeleteOldStaffProviders(oldStaff, newStaff, x => x.StaffID); 
DeleteOldStaffProviders(oldStaff, newStaff, x => x.LicenseID); 

Sie könnte es eine andere Art und Weise tun - aber ich denke, seine mehr klobig. Der Pass in einer Func<Provider,Provider,bool> wie folgt aus:

DeleteOldStaffProviders(oldStaff, newStaff, (o,n) => o.StaffID == n.StaffID); 

und eine Linie ändern:

bool remove = newSelectedStaff.SingleOrDefault(n => selector(n,oldSelected)) 
+0

@DavidG könnten Sie tun, aber es macht das Prädikat ein bisschen klobig '(x, y) => x.StaffID == y.StaffID' – Jamiec

+0

Guter Ort, Sie haben es hier. – DavidG

+0

Das ist genau die Antwort, die ich erhoffte. (Ich bin mir nicht sicher, warum, aber der erste Weg hat nicht funktioniert. Die "Clunkier" Art und Weise funktionierte toll. Ich habe wahrscheinlich nur die Syntax vermasselt) –

Verwandte Themen