12
votes

Retourneronlycollection de IList <>

OK, la liste <> contient l'asReadonly () qui vous donne la lecture en échec. Ce dont j'ai besoin, c'est avoir un champ de type IList et une propriété qui retournerait une collection à la lecture de cette liste.

Exemple de classe: xxx

Le scénario est suivant: Je dois avoir une logique personnalisée à l'intérieur de ma classe lorsque l'élément est ajouté dans la liste et je tiens à restreindre Ajout à cette liste en appelant Addtolist (quelqueitem), tout en ne permettant pas d'utiliser l'utilisation de liste.Ajouter (quelqueitem). Le problème est que j'utilise NHibernate lequel nécessite l'interface iliste , donc je ne peux pas lancer / appeler l'asreadonly () sur l'iList (il ne contient pas cette méthode). < / p>

Quelle façon recommanderiez-vous à résoudre cette situation? J'ai simplement besoin d'un moyen pour NHibernate de définir la collection nécessaire d'une manière ou d'une autre, mais j'ai aussi besoin de restreindre les utilisateurs.


1 commentaires

Vous voudrez peut-être aussi voir Stackoverflow.com/Questtions/5522654/...


5 Réponses :


7
votes

Essayez xxx


3 commentaires

Ok, j'ai aussi pensé à cela, mais je préférerais la solution qui ne copie pas sur le contenu de la collection à une autre collection, et cela le fera en dessous, non?


Cela fera une copie ... Une solution sans copie n'est possible que si vous créez une classe, implémente l'interface IList et utilisez-la ...


@Yahia: mal. Cela ne crée pas de copie



30
votes

Vous pouvez simplement imiter asreadonly () : xxx

update :
Cela ne crée pas une copie de la liste . Readonlycollection ne copie pas les données, il fonctionne directement sur la liste fournie. Voir Documentation :

Une collection en lecture seule est simplement une collection avec une enveloppe qui empêche la modification de la collection; Par conséquent, si des modifications sont apportées à la collection sous-jacente, la collection en lecture seule reflète ces changements.
Ce constructeur est une opération O (1).


2 commentaires

Cela créera-t-il une nouvelle collection avec itération via tous les articles, ou conserve la référence au basculement intérieur sous-jacent?


Cela ne crée pas de copie. C'est exactement le même code que celui utilisé dans asreadonly . Si vous ne voulez pas ce comportement, vous devez reformuler votre question.



1
votes

Utilisez la manière suivante,

<bag 
      name="SubTests" table="SubTest" lazy="true" access="field.camelcase-underscore"
      optimistic-lock="false"
      >
      <key column ="TestID" />
      <many-to-many class="SubTest, Domain" column="SubTestID" />
    </bag>


0 commentaires

1
votes

Vous pouvez également revenir ienumerable qui est en lecture seule Itératrice et fournit des méthodes d'ajout et d'élimination des éléments.


0 commentaires

1
votes

À mon avis, la meilleure façon de le faire est de revenir ienumerable code> à l'aide de Méthode suggérée par Jon Skeet :

public IEnumerable<Abc> Abcs {
    get { return list.Skip(0); }
}


0 commentaires