我见过的扩展方法的所有示例都在类中使用扩展方法:
class Program
{
static void Main()
{
...Call extension method here
}
}
这些似乎有效,因为消费类是静态的。有没有办法在非静态类中使用扩展方法,如下所示?我似乎无法找到这样的例子。
我有我的扩展方法类:
using System;
using System.Collections.Generic;
namespace AwesomeApp
{
public static class LinqExtensionMethods
{
public static IEnumerable<T> FindItemsBeforeAndAfter<T>(this IEnumerable<T> items, Predicate<T> matchFilling)
{
if (items == null)
throw new ArgumentNullException("items");
if (matchFilling == null)
throw new ArgumentNullException("matchFilling");
return items;
}
}
}
我的班级使用了扩展方法
namespace AwesomeApp
{
public class Leaders : ILeaders
{
var leaders = GetAllLeaders();
var orderedleaders = leaders.OrderByDescending(o => o.PointsEarned);
var test = orderedleaders.FindItemsBeforeAndAfter(w => w.UserId == 1);
}
}
如果我从静态类中调用扩展方法,那么我不会在非泛型静态类中定义&#39;扩展方法。错误:
public class test
{
public void testfunc()
{
List<int> testlist = new List<int>() {1,2,3,4,5,6,7,8,9};
testlist.FindItemsBeforeAndAfter<int>(e => e == 5);
}
}
我已经阅读了我可以在非泛型静态类错误上找到的所有stackoverflow答案,他们处理编写扩展方法但不处理消费它。
所以问题是:如果使用带有非静态类的扩展方法是不可能的,那么有没有办法做一些类似的工作方式?例如,它可以被称为.ExtensionMethod而不是Helper.ExtensionMethod(传递对象)??
解决方案:我认为我将扩展方法从公共类的领导者:ILeaders剪切并粘贴到自己的类中,以便我可以将其设置为静态,但实际上我只是复制了它。编译器错误指向类名,所以我没有看到扩展方法仍然在文件的底部。错误消息是准确的,每个回答的都是正确的。
答案 0 :(得分:5)
这些似乎有效,因为消费类是静态的。
不,那是不对的。扩展方法绝对不必从静态类或静态方法消耗。
但是,它们必须在以下类中声明:
当你说:
时,你似乎在混淆呼叫时感到困惑如果我从静态类调用扩展方法,我不会'扩展方法必须在非泛型静态类中定义'错误
...如果您尝试在不满足上述所有条件的类中声明方法,那么您将只能得到它。您应该双击错误以显示它的生成位置 - 我相信您会发现它是声明,而不是使用该方法。
请注意,您的最后一个示例(类test
)不是静态类,也不是静态方法。