Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Методы расширения можно вызывать только случаи типа, и поскольку 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;
        }
    } 
}

Почему вы хотите расширить 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;
    }
}

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top