在c#中扩展Enumerable类?

Ram*_*Vel 5 c# extension-methods static-classes

我有条件扩展c#中的Enumerable类来添加接受长参数的新Range方法.我无法定义这样的方法

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

由于扩展方法只能通过其对象访问.它给了我一个错误

'System.Linq.Enumerable':静态类型不能用作参数

我们可以澄清一下如何做到这一点

注意:我知道我们可以在没有扩展方法的情况下轻松解决这个问题,但我需要这个Enumrable类.

Mat*_*ton 8

你(像我一样)正在寻找静态扩展方法:

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

这在C#中是不可能的.最接近的替代方法是定义另一个具有相似名称的静态类(LongEnumerable?)并将静态方法添加到该类中.


Luk*_*keH 5

扩展方法只能在类型的实例上调用,并且由于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;
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)