Wie kann ich Adds zu einer generischen Liste in C # 4.0 erkennen?

8

Ich habe eine Unterklasse von List<Location> namens LocationList . Dies ist eine bequeme Möglichkeit für uns, weitere Eigenschaften hinzuzufügen (wie IsExpanded und solche, die wir in der Benutzeroberfläche verwenden können. Gut genug. Aber jetzt möchten wir, dass jeder Standort sich seiner Eltern bewusst ist. Als solche müssen wir sein wird benachrichtigt, wenn etwas zu LocationList hinzugefügt wird, aber Sie können Add und Remove nicht überschreiben.Während wir ObservableCollection verwenden können, ist dies eher ein View / ViewModel-Konstrukt. Dies sind reine Modelldaten.

Sicher, wir könnten das übergeordnete Element manuell festlegen, wenn wir es zur Sammlung hinzufügen, aber ich hasse nicht-automatisierte Logik wie diese, da es nichts gibt, was das Set korrekt erzwingt. Lass die Sammlung (naja, Liste) automatisch sagen "Hey ... du wirst hinzugefügt, also werde ich deine Eltern zu der Klasse machen, die mich besitzt." Ist was ich suche.

Mein Gedanke ist, statt der Unterklasse List<Location> stattdessen eine gerade Klasse zu erstellen, die intern List<Location> verwendet, und dann kann ich einfach meine eigenen Add / Remove-Methoden verfügbar machen und die Anpassungen an 'Parent' dort vornehmen . Dies zu tun, bricht jedoch in der Lage sein, über die interne Sammlung aufzuzählen, da es innen ist.

Gibt es eine Möglichkeit, Änderungen an List<Location> zu hören oder zumindest seine IEnumerable -Schnittstelle vom Wrapped-Objekt an den Wrapper zu delegieren?

    
MarqueIV 07.07.2011, 04:33
quelle

6 Antworten

8

Ändern Sie stattdessen Ihre LocationList so, dass sie von Collection<Location> erbt. Ich weiß nicht, warum List<T> nicht versiegelt ist, aber es ist nicht erweiterbar.

Quelle: Framework Design Guidelines, zweite Ausgabe, Seite 251:

  

List<T> ist auf Kosten der Reinheit der APIs und der Flexibilität für Leistung und Leistung optimiert.

    
Michael Stum 07.07.2011, 04:36
quelle
4

List<T> hat geschützte Mitglieder InsertItem<T> , RemoveItem<T> etc, die Sie in Ihrer abgeleiteten Klasse überschreiben können, um das zu tun, was Sie wollen.

** UPDATE **

Tatsächlich ist das obige falsch, es ist Collection<T> , das diese geschützten Methoden hat. Im Allgemeinen wird beim Ableiten benutzerdefinierter List-Klassen empfohlen, von Collection<T> anstatt List<T> abzuleiten.

Siehe diese Antwort .

    
Joe 07.07.2011 04:35
quelle
2
  

Mein Gedanke ist statt Unterklasse   Liste um stattdessen nur zu erstellen   eine gerade Klasse, die ein verwendet   Liste intern, und dann ich   kann einfach meine eigene Add / Remove verfügbar machen   Methoden und behandeln die Anpassungen an   "Eltern" in dort. Aber so   bricht auf, um aufzuzählen   die interne Sammlung seit es ist   innen.

Sie können IEnumerable<Location> weiterhin in Ihrer benutzerdefinierten Sammlung implementieren. Verwenden Sie List<> als interne Implementierungsdetail der Klasse, und Sie können Aufzählung über die Schnittstelle zulassen.

%Vor%     
Anthony Pegram 07.07.2011 04:40
quelle
1

Probieren Sie das generische BindingList<T> aus, das Ereignisse auslöst, wenn Elemente hinzugefügt und entfernt werden.

    
Ben Voigt 07.07.2011 04:42
quelle
0
  

Allerdings bricht es dabei ab, über die interne Sammlung aufzählen zu können, da sie sich darin befindet.

Dies ist nicht wahr, vorausgesetzt, Sie folgen der richtigen Technik und implementieren IEnumerable und ICollection

Aber ich würde Observable-Sammlung verwenden, anstatt das Rad neu zu erfinden.

Und natürlich können Sie Reaktive Erweiterungen verwenden, um zu tun, was Sie brauchen.

    
Dmytrii Nagirniak 07.07.2011 04:38
quelle
0

Sie können entweder das Beobachtermuster

verwenden     
Arian 07.07.2011 04:40
quelle

Tags und Links