2009-11-05 33 views
5

Tengo una situación para extender la clase Enumerable en C# para agregar el nuevo método Range que acepta parámetros largos. No puedo definir el método como este¿Extender la clase Enumerable en C#?

public static IEnumerable<long> Range(this Enumerable source, long start, long length) 
{ 
    for (long i = start; i < length; i++) 
    { 
     yield return i; 
    } 
} 

Dado que los métodos de extensión son accesibles solo a través de sus objetos. Y me da un error

'System.Linq.Enumerable': tipos estáticos no se pueden utilizar como parámetros

Puede someonce mí aclarar cómo hacer esto

Nota: Sé podemos resolver esto fácilmente sin métodos de extensión, pero necesitaba esta clase Enumrable.

Respuesta

8

Usted (como yo) están buscando métodos de extensión estáticas:

http://madprops.org/blog/static-extension-methods/

No es posible en C#. La alternativa más cercana es definir otra clase estática con un nombre similar (LongEnumerable?) Y agregar su método estático a eso.

0

No puede ampliar la clase Enumerable, ya que no tiene una instancia Enumerable - es una clase static. Los métodos de extensión solo funcionan en instancias, nunca funcionan en la clase estática en sí misma.

0

Vas a tener que crear tu propia clase de utilidad para eso; usted puede agregar métodos estáticos a través de métodos de extensión.

5

Los métodos de extensión, sólo pueden usarse en casos de un tipo, y desde Enumerable es un tipo estático no habrá nunca ningún caso de que, lo que significa que no se puede extenderlo.

No tiene sentido tener su método Range como una extensión en IEnumerable<T> tampoco. Su método solo genera una secuencia de valores long, no necesita extender ninguna instancia en particular.

utilizar un método estándar de utilidad estática en su lugar:

var example = EnumerableUtils.Range(0, long.MaxValue).Where(x => (x % 2) == 0); 

// ... 

public static class EnumerableUtils 
{ 
    public static IEnumerable<long> Range(long start, long count) 
    { 
     for (long i = start; i < start + count; i++) 
     { 
      yield return i; 
     } 
    } 
} 
1

¿Por qué quiere extender System.Linq.Enumerable? Esta clase utiliza métodos de extensión para extender otros tipos que implementan IEnumerable.

El resultado sería, que el que se dice:

Enumerable.Range(long, long); 

prefiere extender el tiempo de clase directamente:

public static IEnumerable<long> Range(this long source, long length) 
{ 
    for (long i = source; i < length; i++) 
    { 
     yield return i; 
    } 
} 

De esta manera se puede empezar con

foreach (long item in 10.Range(20)) { } 
+0

'Enumerable' es una clase de utilidad estática. Por la misma razón que no extendieron 'int', una nueva clase como' LongEnumerableTools' es el mejor enfoque. – Aphelion

Cuestiones relacionadas