在非静态类中使用扩展方法

0 .net c# extension-methods

我见过的扩展方法的所有示例都在类中使用扩展方法:

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到它自己的类,这样我就可以使它静态但我实际上只是复制了它.编译器错误指向类名,所以我没有看到扩展方法仍然在文件的底部.错误消息是准确的,每个回答的都是正确的.

Jon*_*eet 5

这些似乎有效,因为消费类是静态的.

不,那是不对的.扩展方法绝对没有被消耗掉从静态类或静态方法.

但是,它们必须在以下类中声明:

  • 非嵌套
  • 非通用
  • 静态的

当你说: - 当你说:

如果我从静态类调用扩展方法,我不会'扩展方法必须在非泛型静态类中定义'错误

...如果您尝试在不满足上述所有条件的类中声明方法,那么您将只能得到它.你应该双击错误来显示它的生成位置 - 我相信你会发现它是声明,而不是使用方法.

请注意,您的最终示例(类test)不是静态类,也不是静态方法.