Расширение класса Enumerable в С#?

У меня есть ситуация, чтобы расширить класс Enumerable в С#, чтобы добавить новый метод Range, который принимает длинные параметры. Я не могу определить метод, подобный этому

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

Так как методы расширения доступны только через его объекты. И это дает мне ошибку

'System.Linq.Enumerable': статические типы не могут использоваться как параметры

Может ли кто-нибудь пояснить мне, как это сделать

Примечание. Я знаю, что мы можем легко решить это без методов расширения, но мне нужен этот класс Enumrable.

5 ответов

Вы (как я) ищем статические методы расширения:

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

Это невозможно в С#. Ближайшей альтернативой является определение другого статического класса с похожим именем (LongEnumerable?) И добавление к нему вашего статического метода.


Методы расширения можно вызывать только в экземплярах типа, и поскольку Enumerable является статическим типом, его никогда не будет никаких экземпляров, а это значит, что вы не можете его расширять.

Нет смысла использовать ваш метод Range как расширение на IEnumerable. Ваш метод просто генерирует последовательность значений 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;
 }
 } 
}
</long>


Почему вы хотите расширить System.Linq.Enumerable? Этот класс использует методы расширения для расширения ДРУГИЕ типы, которые реализуют IEnumerable.

В результате получится:

Enumerable.Range(long, long);

Вы предпочли бы расширить длинный класс напрямую:

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

Таким образом, вы можете начать с

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


Вам понадобится создать для этого свой собственный класс утилиты; вы можете добавлять статические методы с помощью методов расширения.


Вы не можете расширить класс Enumerable, так как у вас нет класса Enumerable - это класс static. Методы расширения работают только с экземплярами, они никогда не работают с самим статическим классом.

licensed under cc by-sa 3.0 with attribution.