2009-04-22 5 views
0

J'essaie de dériver de la liste et d'activer sélectivement la propriété IsReadOnly. J'espérais que les fonctions Add/Remove/[] honoreraient cette propriété, mais ce n'est pas le cas. Quelle est la bonne façon de faire cela?Comment remplacer la liste <T> .IsReadOnly en C#

Ma classe dérivée a des propriétés supplémentaires, donc je ne peux malheureusement pas envelopper la liste dans ReadOnlyCollection.

Répondre

7

Utilisez l'encapsulation au lieu de l'héritage dans ce cas.

Vous devez simplement faire en sorte que votre classe implémente IList <T>, et avoir une variable privée Liste <T>.

Vous pouvez passer à travers toutes les fonctions que vous souhaitez, mais peut également les remplacer complètement, modifier le comportement, etc. Cela vous donne un contrôle complet (au détriment de nombreuses méthodes qui ne font rien sinon appeler this.List.method (. ..)).

En général, je ne pense pas que ce soit une bonne idée d'hériter des classes de collection BCL dans tous les cas. Je préfère en faire un détail d'implémentation interne à ma classe.

2

Vous pouvez appeler la méthode "AsReadOnly" dans la liste qui devrait vous renvoyer une instance IList qui devrait honorer que c'est ... err ... read-only.

... OK, je viens de lire votre dernière phrase, ma mauvaise. Dans ce cas, peut-être que vous voulez simplement implémenter l'interface IList ou n'importe quel ami et juste acheminer la majeure partie de l'interface vers une liste que vous gardez en interne. Ensuite, vous pouvez créer ce comportement. Même ainsi, je ferais un modèle similaire, fournir une méthode "AsReadOnly" qui vous donne explicitement quelque chose qui est en lecture seule.

2

Liste <T> est par définition un type mutable. Il n'y a aucun moyen de le faire en lecture seule.

Si vous effectuez une classe dérivée, vous devriez probablement mettre en œuvre IList <T> directement plutôt que de sous-classement Liste <T> de toute façon. Cela vous donnera un contrôle total sur la mise en œuvre, vous permettant de le faire en lecture seule si vous le souhaitez.

Questions connexes