2009-09-23 10 views
6

Supongamos que tengo una TestCollection clase que se utiliza para mantener los objetos de tipo de prueba y se define comoAdición IEnumerable <T> a clase derivada de CollectionBase

public class TestCollection : CollectionBase 

Esto me permite iterar a través de la colección, ya sea como

foreach(object o in collection) 
... 

o

foreach(Test t in collection) 

pero no permite usar nuevas consultas de Linq

Si cambio de la definición de la clase a

public class TestCollection : CollectionBase, IEnumerable<Test> 

y añadir un método

public new IEnumerator<Test> GetEnumerator() 
{ 
    foreach (Test o in this.List) 
     yield return o ; 
} 

continuación LINQ consultas están disponibles.

Sin embargo este nuevo método no se acaba de llamar para consultas LINQ, sino que también se denomina en el código heredado (es decir, durante el foreach (objeto o en la recolección) y foreach (Prueba de colección).

¿Hay alguna diferencia entre la forma antigua de iterar a través de la colección y esta nueva forma suponiendo que todos los elementos en la colección son del tipo Prueba. Soy consciente de que agregar el método IEnumerator hará que el programa arroje una excepción si encuentra otros tipos que no sean Test , pero quiero saber si he pasado por alto algo.

Respuesta

2

No, verá resultados idénticos y solo experimentará un único nivel adicional de indirección (ya que el nuevo método GetEnumerator simplemente llama al método existente GetEnumerator y transmite su salida).

0

El IEnumerator<T> compilado a partir de un iterador no implementa el método Reset. EDITAR: Quiero decir que lanzará un NotImplementedException.

No hay nada de malo en eso, pero si desea el método Reset, tendrá que escribir su propia clase de iterador, que no es difícil.

+1

No; it * lo implementa * it - como lanzar una 'NotImplementedException'. Los bloques Iterator están bien para este propósito. –

+0

Eso es lo que quise decir. – SLaks

13

Dado que estás en 2.0 (o superior), tal vez solo heredes de Collection<T>?

public class TestCollection : Collection<Test> { 
    // your extra code here 
} 

A continuación presentamos lo mejor IList<T>, ICollection<T>, IEnumerable<T> de forma gratuita, y virtual métodos que puede override para poner su sello en el comportamiento.

+0

+1 Esa es una buena idea también. –

+0

+1 .. estoy de acuerdo con esto. –

+2

Cambiar un tipo de base es un cambio radical: si la clase ya se ha enviado, esto no se debe hacer. – SLaks

Cuestiones relacionadas