2009-11-05 10 views
5

Ho una situazione per estendere la classe Enumerable in C# per aggiungere il nuovo metodo Range che accetta parametri lunghi. Non riesco a definire il metodo come questoEstensione della classe Enumerable in C#?

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

Poiché i metodi di estensione sono accessibili solo attraverso i suoi oggetti. E mi dà un errore

'System.Linq.Enumerable': tipi statici non possono essere utilizzati come parametri

Può someonce mi chiarire come fare questo

Nota: Lo so possiamo facilmente risolvere questo problema senza i metodi di estensione, ma avevo bisogno di questa classe Enumrable.

risposta

8

(come me) sono alla ricerca di metodi di estensione statici:

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

non è possibile in C#. L'alternativa più vicina è definire un'altra classe statica con un nome simile (LongEnumerable?) E aggiungere il proprio metodo statico a quello.

0

Non è possibile estendere la classe Enumerable, poiché non si dispone di un'istanza Enumerable - è una classe static. I metodi di estensione funzionano solo sulle istanze, non funzionano mai sulla stessa classe statica.

0

Dovrai creare la tua classe di utilità per quello; puoi aggiungere metodi statici tramite i metodi di estensione.

5

metodi di estensione possono essere chiamati solo su casi di un tipo, e dal momento che Enumerable è un tipo statico non ci sarà mai alcun istanze di esso, il che significa che non è possibile estenderlo.

Non ha senso avere il tuo metodo Range come interno su IEnumerable<T>. Il tuo metodo genera solo una sequenza di valori long, non è necessario estendere alcuna istanza particolare.

Utilizzare un metodo di utilità statica standard invece:

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

Perché vuoi estendere System.Linq.Enumerable? Questa classe utilizza i metodi Estensione per estendere altri tipi che implementano IEnumerable.

Il risultato sarebbe, che si chiamerebbe:

Enumerable.Range(long, long); 

si preferisce estendono lungo gran classe:

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

In questo modo si può iniziare con

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

'Enumerable' è una classe di utilità statica. Per lo stesso motivo per cui non avevano estensione 'int', una nuova classe come' LongEnumerableTools' è l'approccio migliore. – Aphelion

Problemi correlati