代码之家  ›  专栏  ›  技术社区  ›  RameshVel

扩展C中的可枚举类

  •  5
  • RameshVel  · 技术社区  · 15 年前

    我有情况扩展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”:静态类型 不能用作参数

    有人能告诉我怎么做吗

    注意:我知道在没有扩展方法的情况下我们可以很容易地解决这个问题,但是我需要这个可枚举类。

    5 回复  |  直到 15 年前
        1
  •  8
  •   Matt Hamilton    15 年前

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

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

    在C里是不可能的。最接近的选择是定义另一个同名的静态类(longEnumerable?)然后添加静态方法。

        2
  •  5
  •   LukeH    15 年前

    只能对调用扩展方法 实例 一种类型的,并且从 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;
            }
        } 
    }
    
        3
  •  1
  •   Sebastian P.R. Gingter    15 年前

    为什么要扩展System.Linq.Enumerable? 此类使用扩展方法扩展实现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)) { }
    
        4
  •  0
  •   configurator    15 年前

    你不能延长 Enumerable 因为你没有 可枚举的 实例-这是一个 static 班级。扩展方法只在实例上工作,它们从不在静态类本身上工作。

        5
  •  0
  •   Marc Gravell    15 年前

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