我有条件扩展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类。
答案 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)
你将不得不为此创建自己的实用程序类;你可以通过扩展方法添加静态方法。