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を拡張したいのですか?このクラスは、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)) { }
于 2009-11-05T10:01:25.650 に答える
0

そのために独自のユーティリティクラスを作成する必要があります。拡張メソッドを介して静的メソッドを追加できます。

于 2009-11-05T09:58:48.307 に答える
0

インスタンスがないため、Enumerableクラスを拡張することはできません。これはクラスです。拡張メソッドはインスタンスでのみ機能し、静的クラス自体では機能しません。Enumerablestatic

于 2009-11-05T09:55:07.040 に答える