2015-05-12 28 views
0

所有的,我已经看到了扩展方法的例子扩展方法消耗的扩展方法像一类:消耗非静态类

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); 
    } 
} 

如果我把从静态类的扩展方法我不要了的'扩展方法必须在非通用静态类中定义'错误:

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(passedObject)?

分辨率:我以为我把公共类领导者:ILeaders的扩展方法剪切并粘贴到它自己的类中,这样我就可以使它成为静态的,但我实际上只是复制它。编译器错误指向类名,所以我没有看到扩展方法仍然在文件的底部。错误信息是准确的,每个人的回答都是正确的。

+1

是的,这是所有的时间。我不确定你是如何得到一个错误的,它应该是正常的。 –

+1

完全可以使用非静态类的扩展方法。作为第一个检查,你可以绝对确认你没有第二个FindItemsBeforeAndAfter的定义吗? – tolanj

+1

您发布的领导代码在语法上无效,您有var leaders = GetAllLeaders();这是一个字段(即它不是在一个方法),但你不能使用var的字段。 – tolanj

回答

5

These seem to work because the consuming class is static.

不,这是不正确的。扩展方法绝对不一定要从静态类或静态方法中消耗

但是,他们必须宣布一类是

  • 非嵌套
  • 非通用
  • 静态

你似乎是混乱打电话声明 - 当你说:

If I call the extension method from a static class I do not the the 'Extension method must be defined in a non-generic static class' error

...只有当您尝试声明时,您将只会得到该方法不符合上述所有条件。你应该双击错误来显示它的生成位置 - 我相信你会发现它是声明,而不是方法的使用。

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

+0

嗨,我混淆了问题,但根据我的知识op可以在测试类中使用extestion方法,应该没有错误...对吧? –

+0

@PranayRana:是的,在测试课上应该没问题 - 而且OP似乎在说他们已经没有看到任何错误了。 –