Extending the Enumerable class in c#?

对着背影说爱祢 提交于 2019-12-06 03:29:13

问题


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.


回答1:


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.




回答2:


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;
        }
    } 
}



回答3:


Why do you want to extend System.Linq.Enumerable? This class uses Extension methods to extend OTHER types that implement IEnumerable.

The result would be, that you'd call:

Enumerable.Range(long, long);

You'd rather extend the long class directly:

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

This way you can start with

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



回答4:


You can't extend the Enumerable class, since you don't have an Enumerable instance - it's a static class. Extension methods only work on instances, they never work on the static class itself.




回答5:


You're going to have to create your own utility class for that; you can'd add static methods via extension methods.



来源:https://stackoverflow.com/questions/1679476/extending-the-enumerable-class-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!