2014-04-13 109 views
0

我知道IEnumerable是一个接口,我也知道当一个类实现一个接口时,它必须为该接口中的方法实现特定的主体。我最近一直在编写一个程序,我觉得我需要将Ienumerable实现到我的一个类中,以便在foreach循环中使用它。之后,我这样做这是做这样:实现IEnumberable接口

class FData: IEnumerable<EClass> { 

    // Removed the irrelevant contents 
    public IEnumerator<EnumerableClass> GetEnumerator() 
    {  
     for (int i = 0; i < Emp_Id.Count; i++) { 
      yield return (new EnumerableClass { Emp_Id = Emp_Id[i], Salary = Salary[i] }); 
     } 
    } 
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

我看到我的FDATA类可以使用完全一样,就好像它在继承所有枚举的方法,如选择(列表),全部(),任何()等。

我想知道如果这些方法的行为没有在界面中定义,究竟发生了什么?

回答

7

所有这些方法都是extension方法,用于实现IEnumerable接口的类型。因此,一旦类型实现IEnumerable也具有这些方法 - 除了方法之外,这些方法已经在类型的主体内定义了。

有关更多文档,请查看here。另外,如果您还没有听说过extension方法,请先看看here

+0

这里没有扩展方法。 –

+0

@JonHanna你的意思是? – Christos

+0

我的意思是,你的回答是关于扩展方法,以及指向扩展方法描述的链接,但它们与这个问题无关。 –

2

他们是扩展方法,这里有一些更多的信息。

扩展方法存在静态类内为静态方法的一些名称空间内,并且该方法的第一个参数包括所述this关键字(见下文的OfType的示例方法的签名)。在这种情况下,您可能会看到System.Linq.Enumerable extension methods。如果您要从类文件中删除using System.Linq名称空间,那么这些扩展方法将不再可用。像Resharper这样的市场重构工具会在适当的时候推荐扩展方法,但是Visual Studio中开箱即用的方法不会提示扩展方法(例如Ctrl +。)。因此,如果你想要它们,你必须确保在类文件的顶部添加一个合适的using语句。如果您不需要它们,并且不需要名称空间中的任何其他类,则可以将其删除,并且扩展方法将不再可用。

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source); 

这样做的好处是,任何实现IEnumerable将有可用的OfType方法,只要该扩展方法的命名空间包含在内。您也可以制作自己的扩展方法。