我见过的扩展方法的所有示例都在类中使用扩展方法:
class Program
{
static void Main()
{
...Call extension method here
}
}
Run Code Online (Sandbox Code Playgroud)
这些似乎有效,因为消费类是静态的.有没有办法在非静态类中使用扩展方法,如下所示?我似乎无法找到这样的例子.
我有我的扩展方法类:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的班级使用了扩展方法
namespace AwesomeApp
{
public class Leaders : ILeaders
{
var leaders = GetAllLeaders();
var orderedleaders = leaders.OrderByDescending(o => o.PointsEarned);
var test = orderedleaders.FindItemsBeforeAndAfter(w => w.UserId == 1);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我从静态类调用扩展方法,我不会'扩展方法必须在非泛型静态类中定义'错误:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了我可以在非泛型静态类错误上找到的所有stackoverflow答案,他们处理编写扩展方法但不处理它的消费.
所以问题是:如果使用带有非静态类的扩展方法是不可能的,那么有没有办法以类似的方式做一些工作?例如,它可以被称为.ExtensionMethod而不是Helper.ExtensionMethod(传递对象)??
解决方案: 我认为我从公共类领导者剪切并粘贴了扩展方法:ILeaders到它自己的类,这样我就可以使它静态但我实际上只是复制了它.编译器错误指向类名,所以我没有看到扩展方法仍然在文件的底部.错误消息是准确的,每个回答的都是正确的.
这些似乎有效,因为消费类是静态的.
不,那是不对的.扩展方法绝对没有被消耗掉从静态类或静态方法.
但是,它们必须在以下类中声明:
当你说: - 当你说:
如果我从静态类调用扩展方法,我不会'扩展方法必须在非泛型静态类中定义'错误
...如果您尝试在不满足上述所有条件的类中声明方法,那么您将只能得到它.你应该双击错误来显示它的生成位置 - 我相信你会发现它是声明,而不是使用方法.
请注意,您的最终示例(类test)不是静态类,也不是静态方法.