Расширение класса Enumerable в С#?
-
16-09-2019 - |
Вопрос
У меня есть возможность расширить класс 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
сорт.Методы расширения работают только с экземплярами и никогда не работают с самим статическим классом.
Для этого вам придется создать свой собственный служебный класс;вы можете добавить статические методы через методы расширения.