2009-11-05 22 views
5

Uzun parametreyi kabul yeni Range yöntemi eklemek için C# Enumerable sınıfını genişletmek için durum var. Bu yöntemi şu şekilde tanımlayamıyorum: Bu yöntem, yalnızca nesneleri aracılığıyla erişilebildiğinden, bu yöntem şu şekilde tanımlanamıyorum.Numaralandırılabilir sınıfı C# olarak genişletmek?

nasıl bu

Not yapmamı açıklık someonce Can parametreleri olarak kullanılamaz statik türlerini: Ve bana bir hata

'System.Linq.Enumerable' verir biliyorum bunu uzatma yöntemleri olmadan kolayca çözebiliriz, ama bu Enumrable sınıfına ihtiyacım vardı.

cevap

8

Sen (benim gibi) statik uzatma yöntemlerine arıyoruz:

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

O C# mümkün değildir. En yakın alternatif benzer bir ada sahip başka bir statik sınıf tanımlamak (LongEnumerable?) Ve buna statik yönteminizi eklemektir. Bunun için kendi yardımcı sınıf oluşturmak zorunda olacak

0

Enumerable örneğiniz olmadığından Enumerable sınıfını genişletemezsiniz - bu bir static sınıfıdır. Uzantı yöntemleri yalnızca örnekler üzerinde çalışır, asla statik sınıfın kendisinde çalışırlar.

0

; Uzatma yöntemleri ile statik yöntemler ekleyebilirsiniz.

5

Uzatma yöntemleri yalnızca durumlarda bir tür üzerine çağrılabilir ve Enumerable statik türüdür beri bunu uzatmak anlamına gelir bunun, dair bir örnek olmayacak.

Ya IEnumerable<T> üzerinde bir uzantı olarak Range yöntemi için hiçbir mantıklı. İşletme yöntem sadece long değerlerinin bir dizisini oluşturur, bu herhangi bir örneği uzatmak gerekmez.

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

Neden System.Linq.Enumerable uzatmak istiyorsunuz:

yerine standart bir statik yarar yöntemi kullanın? Bu sınıf IEnumerable uygulamak DİĞER türlerini uzatmak için Uzatma yöntemleri kullanır.

sonuç arayacağını yapmak olacağını:

Enumerable.Range(long, long); 

Sen ziyade doğrudan uzun sınıfını genişletmek istiyorum: Eğer başlayabilirsiniz

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

Bu şekilde

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

'Enumerable' statik bir yardımcı program sınıfıdır. onlar ölçüde 'int' vermedi Aynı nedenle, gibi yeni bir sınıf' LongEnumerableTools' daha iyi bir yaklaşımdır. – Aphelion

İlgili konular