在非静态类

时间:2015-05-12 08:50:19

标签: c# .net extension-methods

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

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剪切并粘贴到自己的类中,以便我可以将其设置为静态,但实际上我只是复制了它。编译器错误指向类名,所以我没有看到扩展方法仍然在文件的底部。错误消息是准确的,每个回答的都是正确的。

1 个答案:

答案 0 :(得分:5)

  

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

不,那是不对的。扩展方法绝对不必从静态类或静态方法消耗

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

  • 非嵌套
  • 非通用
  • 静态

当你说:

时,你似乎在混淆呼叫时感到困惑
  

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

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

请注意,您的最后一个示例(类test是静态类,也不是静态方法。

相关问题