2009-11-05 4 views
5

나는 긴 매개 변수를 받아들이는 새로운 Range 메서드를 추가하기 위해 C#에서 Enumerable 클래스를 확장해야 할 상황이 있습니다. 이 방법을 정의 할 수 없다.C#에서 Enumerable 클래스 확장?

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

확장 메서드는 해당 개체를 통해서만 액세스 할 수 있기 때문에.

방법이

주를 수행하는 저를 명확히 someonce 수 매개 변수로 를 사용할 수없는 정적 유형 : : 그리고 그것은 나에게 오류

'System.Linq.Enumerable'를 제공 알아요 우리는 확장 메서드없이이 문제를 쉽게 해결할 수 있지만이 Enumrable 클래스가 필요했습니다.

답변

8

당신 (나 같은) 정적 확장 방법을 찾고 있습니다 :

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

는 C#으로 수 없습니다. 가장 가까운 대안은 유사한 이름 (LongEnumerable?)을 가진 다른 정적 클래스를 정의하고 정적 메서드를 추가하는 것입니다.

0

Enumerable 인스턴스가 없으므로 Enumerable 클래스를 확장 할 수 없습니다.이 클래스는 static 클래스입니다. 확장 메서드는 인스턴스에서만 작동하며 정적 클래스 자체에서는 작동하지 않습니다.

0

당신은 자신의 유틸리티 클래스를 만들어야합니다. 확장 메서드를 통해 정적 메서드를 추가 할 수 없습니다.

5

확장 방법은 인스턴스 유형의 호출 할 수 있으며, Enumerable 정적 타입이기 때문에 당신이 그것을 확장 할 수 있다는 것을 의미한다 그것의 모든 인스턴스, 존재하지 않을 것입니다.

Range 방법을 IEnumerable<T>의 확장으로 사용하는 것은 이치에 맞지 않습니다. 귀하의 방법은 단지 long 값의 시퀀스를 생성하기 때문에 특정 인스턴스를 확장 할 필요가 없습니다.

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

왜 System.Linq.Enumerable을 확장 할 수행

대신 표준 정적 유틸리티 메소드를 사용? 이 클래스는 Extension 메서드를 사용하여 IEnumerable을 구현하는 OTHER 형식을 확장합니다.

결과는 전화 할 거라고, 다음과 같습니다

Enumerable.Range(long, long); 

당신은 오히려 직접 긴 클래스를 확장하는 것입니다 : 당신이 시작할 수

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

이 방법을

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

'Enumerable'은 정적 유틸리티 클래스입니다. 그들은 int의 범위를 벗어난 동일한 이유 때문에 LongEnumerableTools와 같은 새로운 클래스가 더 나은 접근 방법입니다. – Aphelion