在c#中扩展Enumerable类?

时间:2009-11-05 09:52:19

标签: 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;
    }
}

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

  

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

可以告诉我如何做到这一点

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

5 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分: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;
        }
    } 
}

答案 2 :(得分:1)

为什么要扩展System.Linq.Enumerable? 此类使用Extension方法扩展实现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)) { }

答案 3 :(得分:0)

您无法扩展Enumerable类,因为您没有Enumerable实例 - 它是static类。扩展方法仅适用于实例,它们从不在静态类本身上工作。

答案 4 :(得分:0)

你将不得不为此创建自己的实用程序类;你可以通过扩展方法添加静态方法。