2009-12-12 5 views
9

Ich habe eine Klasse, die nur ein Wrapper über eine Liste, dhimplementieren IEnumerable <T> Für eine Liste Wrapper

public class Wrapper 
{ 
    public List<int> TList 
    {get;set;} 
    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 

I Wrapper erbt von IEnumerable machen wollen, so dass ich die folgende Syntax verwenden:

Wrapper wrapper = new Wrapper() 
         { 
         2,4,3,6 
         }; 

Jede Idee, wie man die Schnittstelle IEnumerable<T> oder IEnumerable, zu implementieren und wie die Methode Körper zu definieren?

+0

Nein, mit IEnumerable wird es nicht funktionieren. Ich denke du musst ICollection implementieren. – deerchao

+3

Nein, deerchao, es braucht IEnumerable . Wir verlangen * ICollection nicht, obwohl es natürlich sinnvoll ist, dies zu tun. –

Antwort

32

Wenn Sie ICollection<int> implementieren, erhalten Sie die gewünschte Funktionalität.

Korrektur: Sie brauchen eigentlich nur IEnumerable oder IEnumerable<T> und haben eine öffentliche Add Methode in Ihrer Klasse zu implementieren:

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    { get; private set; } 
    public Wrapper() 
    { 
     TList = new List<int>(); 
    } 

    public void Add(int item) 
    { 
     TList.Add(item); 
    } 
    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

(Ich habe auch die Freiheit, so dass die TList Setter privat, es ist in der Regel wird empfohlen, Eigenschaften des Sammlertyps sind schreibgeschützt, so dass die Sammlung als solche nicht durch Code außerhalb des Typs ersetzt werden kann.)

+0

Verdammt, du schlägst mich dazu :) – ICR

+0

Warum müssen wir sowohl eine generische als auch eine nicht-generische Version von GetEnumerator implementieren? – hdgarrood

+0

@hdgarrood Dies ist notwendig, weil IEnumerable 'IEnumerable' erbt, was nicht generisch ist. Ein Typ, der 'IEnumerable ' implementiert, implementiert auch 'IEnumerable', also müssen diese Methoden ebenfalls vorhanden sein. –

9

Um Auflistungsinitialisierer zu erhalten, müssen Sie 2 Dinge tun:

  1. IEnumerable implementieren
  2. haben eine Methode namens hinzufügen mit der korrekten Signatur

Der bevorzugte Weg, um diese zu erhalten, ist ICollection zu implementieren, aber das Minimum Sie tun müssen, ist:

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    {get;set;} 

    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() // Explicitly implement the non-generic version. 
    { 
     return TList.GetEnumerator(); 
    } 

    public void Add(int i) 
    { 
     TList.Add(i); 
    } 

    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 
Verwandte Themen