5

我有情况在 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 类。

4

5 回答 5

8

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

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

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

于 2009-11-05T09:55:57.530 回答
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;
        }
    } 
}
于 2009-11-05T09:59:01.550 回答
1

为什么要扩展 System.Linq.Enumerable?此类使用扩展方法来扩展实现 IEnumerable 的其他类型。

结果将是,您将调用:

Enumerable.Range(long, 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)) { }
于 2009-11-05T10:01:25.650 回答
0

你不能扩展这个Enumerable类,因为你没有一个Enumerable实例——它是一个static类。扩展方法仅适用于实例,它们从不适用于静态类本身。

于 2009-11-05T09:55:07.040 回答
0

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

于 2009-11-05T09:58:48.307 回答