Convenience oder „faul Programmierung“ IList Management - Schutz IList.Add Verfahren

StackOverflow https://stackoverflow.com/questions/554159

  •  23-08-2019
  •  | 
  •  

Frage

Wie bewerten Sie dieses einfache Szenario verwalten, wenn Sie ein Objekt mit einer Liste von Elementen haben. Beispiel:

public class ContainerObject
{
    IList<ChildObject> Children { get; }

    public void AddCustom(ChildObject toAdd)
    {
        // Some validation ...
        Children.Add(toAdd);
    }
}

Unter der Annahme, die Sammlung auf eine Implementierung von IList initialisiert wird, ist es eine Möglichkeit, in der die Art und Weise zu steuern, in der die Elemente in die Liste aufgenommen werden?

Zum Beispiel habe ich eine andere Methode auf der ContainerObject Klasse, die eine Childobject nimmt und fügt sie die Liste. Diese Methode ist erforderlich, einige grundlegende Validierung auf der Childobject durchzuführen, bevor sie hinzugefügt wird.

Ich bin faul, dass ich zu verwirren nicht herum wollen und eine benutzerdefinierte Liste-Schnittstelle (ohne Add-Methode) schreiben, dass der Konsum Entwickler implementieren müssen. Ich bin auch den ToList () -Methode auf der IQueryable-Schnittstelle so dies ein weiterer Grund ist mit IList zum Aufkleben -. Es funktioniert einfach

So

gibt es einen Ansatz, bei dem Sie Polizei können, wie Elemente in die IList-Instanz hinzugefügt wird das heißt die Verwendung der Add-Methode verhindern und erlaubt nur über meine eigene Methode zur Sammlung hinzufügen, oder bin ich nur für das Unmögliche zu fragen? ... und faul: (

Ich kann in dem denken von wenigen Hacky Möglichkeiten zu überprüfen, wenn Einzelteile über meine eigene Methode hinzugefügt werden, oder direkt auf der Liste, aber diese scheinen Hacky!

Wer etwas ähnlich wie diese erlebt? Wenn ja, was hast du getan?

War es hilfreich?

Lösung

Gibt ein Readonlycollection in der Welt Ihre Liste Einwickeln die Sie verwalten die Adds zu.

Andere Tipps

Sie können Ihre Immobilie machen einen Wrapper zurückgeben um die ursprüngliche Liste mit ReadOnlyCollection<T> . Dadurch wird sichergestellt, dass Anrufer hinzufügen, keine Einzelteile selbst. Sie können einen Verweis auf die ursprüngliche wandelbar Liste halten. Beachten Sie, dass, weil die Nur-Lese-Sammlung nur ein Wrapper ist, können Anrufer, die die schreibgeschützte Auflistung zwischengespeichert werden noch Ergänzungen sehen, dass Sie auf die ursprüngliche Liste. Das mag oder nicht, eine gute Sache je nach erwarteten Nutzen sein kann.

EDIT: Zu meinem Caching Kommentar erklären ...

Angenommen, ein Kunde hat:

IList<ChildObject> originalChildren = container.Children;    
container.AddChild(new ChildObject());
IList<ChildObject> updatedChildren = container.Children;    

mit der Children Eigenschaft wie folgt umgesetzt:

private IList<ChildObject> children = new List<ChildObject>();
public IList<ChildObject> Children
{
    get { return new ReadOnlyCollection<ChildObject>(children); }
}

Dann originalChildren und updateChildren würden beide haben den gleichen Inhalt - die zurück ReadOnlyCollection keine Schnappschuss die Sammlung von Kindern in der ersten Zeile wäre. Es wäre nur ein Wrapper sein um die Sammlung. Kunden nicht in der Lage sein, sich auf sie nicht zu ändern -. Sie würden nur nicht in der Lage sein, es selbst zu ändern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top