2010-03-05 3 views
4

Je veux essentiellement le faire dans le code:Puis-je avoir une classe avec une liste générique et exposer que la valeur par défaut

PersonList myPersonList; 
//populate myPersonList here, not shown 

Foreach (Person myPerson in myPersonList) 
{ 
... 
} 

classe déclare

public class PersonList 
{ 
public List<Person> myIntenalList; 

Person CustomFunction() 
{...} 
} 

Alors, comment puis-je exposer " myInternalList "dans ma classe comme valeur par défaut que l'instruction Foreach peut utiliser? Ou puis-je? Raison en est que j'ai environ 50 classes qui utilisent actuellement GenericCollection que je voudrais passer aux génériques, mais ne veulent pas réécrire une tonne.

+0

Qu'entendez-vous par "valeur par défaut?" C# n'a pas de propriétés par défaut comme VB. –

Répondre

9

Vous pouvez faire PersonList mettre en œuvre IEnumerable<Person>

public class PersonList : IEnumerable<Person> 
{ 
    public List<Person> myIntenalList; 

    public IEnumerator<Person> GetEnumerator() 
    { 
     return this.myInternalList.GetEnumerator(); 
    } 

    Person CustomFunction() 
    {...} 
} 

Ou encore plus simple, il suffit de faire PersonList étendre Liste:

public class PersonList : List<Person> 
{ 
    Person CustomFunction() { ... } 
} 

La première méthode a l'avantage de ne pas exposer les méthodes de List<T>, alors que le la seconde est plus pratique si vous voulez cette fonctionnalité. En outre, vous devriez rendre myInternalList privé.

+1

Je choisirais la solution d'avoir implémenté 'PersonList'' IEnumerable 'plutôt que d'hériter de' List '. Voir ma réponse ici pour plus d'informations: http://stackoverflow.com/questions/2136213/c-inherit-from-dictionary-iterate-over-keyvaluepairs/2136235#2136235 – LBushkin

5

La façon la plus simple est d'hériter de votre liste générique:

public class PersonList : List<Person> 
{ 
    public bool CustomMethod() 
    { 
    //... 
    } 

} 
+0

Cela expose également les méthodes pour modifier la liste, je ne sais pas si cela est indeded par l'OP. Sinon, utilisez la solution de Lee. – AxelEckenberger

+2

Ce n'est généralement pas une bonne idée d'hériter des classes de collection .NET. Voir ma réponse ici: http://stackoverflow.com/questions/2136213/c-inherit-from-dictionary-iterate-over-keyvaluepairs/2136235#2136235. – LBushkin

+0

@LBushkin Ce n'est nécessaire que s'ils veulent surcharger ajouter, etc Mais encore quelque chose de bien à garder à l'esprit. –

1

Pourquoi ne pas changer simplement la classe de base sur PersonList être Collection<Person>? Persumably il peut déjà énumérer sur la personne, ainsi votre foreach fonctionnerait toujours.

Questions connexes