2009-11-05 6 views
5

Ich habe Situation, die Enumerable-Klasse in C# zu erweitern, um die neue Range-Methode hinzuzufügen, die lange Parameter akzeptiert. Ich kann die Methode so nicht definierenErweitern der Enumerable-Klasse in C#?

Da Erweiterungsmethoden nur über seine Objekte zugänglich sind. Und es gibt mir einen Fehler

‚System.Linq.Enumerable‘: statischen Typen können nicht verwendet werden als Parameter

Kann mir someonce klären, wie dies zu tun

Hinweis: Ich weiß, Wir können dies ohne Erweiterungsmethoden leicht lösen, aber ich brauchte diese Auflösbare Klasse.

Antwort

8

Sie (wie ich) suchen statische Erweiterungsmethoden:

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

Es ist nicht möglich, in C#. Die nächste Alternative besteht darin, eine andere statische Klasse mit einem ähnlichen Namen (LongEnumerable?) Zu definieren und Ihre statische Methode hinzuzufügen.

0

Sie können die Enumerable Klasse nicht erweitern, da Sie keine Enumerable Instanz haben - es ist eine static Klasse. Erweiterungsmethoden funktionieren nur für Instanzen, sie arbeiten nie mit der statischen Klasse selbst.

0

Sie werden Ihre eigene Dienstprogrammklasse dafür erstellen müssen; Sie können statische Methoden über Erweiterungsmethoden hinzufügen.

5

Erweiterungsmethoden können nur auf Instanzen eines Typs genannt werden, und da Enumerable ein statischer Typ ist es nie irgendwelche Instanzen davon sein, was bedeutet, dass Sie es nicht erweitern können.

Es macht keinen Sinn, Ihre Range Methode als Erweiterung auf IEnumerable<T> entweder zu haben. Ihre Methode generiert nur eine Folge von long Werten, es muss keine bestimmte Instanz erweitert werden.

ein Standard-statische Hilfsmethode Verwenden Sie stattdessen:

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

Warum wollen Sie System.Linq.Enumerable erweitern möchten? Diese Klasse verwendet Erweiterungsmethoden, um ANDERE Typen zu erweitern, die IEnumerable implementieren.

wäre das Ergebnis, dass Sie nennen würde:

Enumerable.Range(long, long); 

Sie würden eher die lange Klasse direkt verlängern:

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

diese Weise können Sie mit

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

'Enumerable' ist eine statische Hilfsklasse. Aus dem gleichen Grund, in dem sie "int" nicht erweitert haben, ist eine neue Klasse wie "LongEnumerableTools" der bessere Ansatz. – Aphelion