2009-11-05 15 views
5

Mam sytuację, aby rozszerzyć klasę Enumerable w języku C#, aby dodać nową metodę Range, która akceptuje długie parametry. Nie mogę zdefiniować metody podobnej do tej, która jest następująca: od metody rozszerzenia są dostępne tylko poprzez jej obiekty. I to daje mi błądRozszerzanie klasy Enumerable wC#?

'System.Linq.Enumerable': Rodzaje statyczne nie mogą być używane jako parametry

Czy someonce wyjaśnić mi jak to zrobić

Uwaga: Wiem możemy łatwo rozwiązać to bez metod rozszerzenia, ale potrzebowałem tej klasy Enumrable.

Odpowiedz

8

You (jak ja) szuka statycznych metod rozszerzenie:

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

To nie jest możliwe w języku C#. Najbliższą alternatywą jest zdefiniowanie innej klasy statycznej o podobnej nazwie (LongEnumerable?) I dodanie do niej swojej metody statycznej.

0

Nie można rozszerzyć klasy Enumerable, ponieważ nie masz instancji Enumerable - jest to klasa static. Metody rozszerzeń działają tylko na instancjach, nigdy nie działają na samej klasie statycznej.

0

Będziesz musiał stworzyć własną klasę narzędziową; nie można dodawać metod statycznych za pomocą metod rozszerzeń.

5

rozszerzenie metod może być wywołana tylko na przypadkach typu, a od Enumerable jest typu statycznego nigdy nie będzie wszelkie przypadki go, co oznacza, że ​​nie można przedłużyć go.

Nie ma sensu stosowanie metody Range jako rozszerzenia na IEnumerable<T>. Twoja metoda generuje tylko sekwencję wartości long, nie trzeba rozszerzać żadnej konkretnej instancji.

pomocą standardowej metody statyczne użytkowej Zamiast:

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

Dlaczego chcesz przedłużyć System.Linq.Enumerable? Ta klasa używa rozszerzeń, aby rozszerzyć INNE typy implementujące IEnumerable.

Wynik byłby, który chcesz zadzwonić:

Enumerable.Range(long, long); 

Wolisz przedłużyć długi klasę bezpośrednio:

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

ten sposób można zacząć

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

'Enumerable' jest statyczną klasą narzędzi. Z tego samego powodu nie miały one zasięgu "int", lepszym rozwiązaniem jest nowa klasa "LongEnumerableTools". – Aphelion