Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extending the Enumerable class in c#?

I have situation to extend the Enumerable class in c# to add the new Range method that accepts long parameters. I cannot define the method like this

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

Since extension methods are accesible only through its objects. And it gives me an error

'System.Linq.Enumerable': static types cannot be used as parameters

Can someonce clarify me how to do this

Note: I know we can easily solve this without extension methods, but i needed this Enumrable class.

like image 539
RameshVel Avatar asked Nov 05 '09 09:11

RameshVel


Video Answer


2 Answers

You (like me) are looking for static extension methods:

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

It's not possible in C#. The closest alternative is to define another static class with a similar name (LongEnumerable?) and add your static method to that.

like image 84
Matt Hamilton Avatar answered Sep 27 '22 22:09

Matt Hamilton


Extension methods can only be called on instances of a type, and since Enumerable is a static type there will never be any instances of it, which means that you can't extend it.

It makes no sense to have your Range method as an extension on IEnumerable<T> either. Your method just generates a sequence of long values, it doesn't need to extend any particular instance.

Use a standard static utility method instead:

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;
        }
    } 
}
like image 42
LukeH Avatar answered Sep 27 '22 21:09

LukeH