Méthode 1: Continuer à utiliser l'encapsulation et transférer les appels à l'implémentation de la liste.
class SomeObject
{
}
class MyEnum : IEnumerable<SomeObject>
{
private List<SomeObject> _myList = new List<SomeObject>();
public void Add(SomeObject o)
{
_myList.Add(o);
}
public IEnumerator<SomeObject> GetEnumerator()
{
return _myList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{
MyEnum a = new MyEnum();
a.Add(new SomeObject());
foreach (SomeObject o in a)
{
Console.WriteLine(o.GetType().ToString());
}
Console.ReadLine();
}
}
Méthode 2: Hériter de la mise en œuvre de la liste que vous obtenez ce comportement gratuitement.
class SomeObject
{
}
class MyEnum : List<SomeObject>
{
}
class Program
{
static void Main(string[] args)
{
MyEnum a = new MyEnum();
a.Add(new SomeObject());
foreach (SomeObject o in a)
{
Console.WriteLine(o.GetType().ToString());
}
Console.ReadLine();
}
}
Méthode 1 permet de mieux sandboxing car il n'y a pas de méthode qui sera appelée liste sans connaissance MyEnum. Pour le moindre effort La méthode 2 est préférée.
Ok, cela fonctionne, mais je veux être sûr que le code d'appel est incapable de type coulée l'énumérateur à List à nouveau et ajouter ou supprimer des objets de celui-ci. – Willem