2014-03-24 93 views
1

我一直在IEnumorator中试图建立一个允许我使用foreach语句快速插入从JSON格式化字符串中提取的大量行到这些嵌套对象中。 Applines类专门由String Get/Set语句组成。实现IEnumerator/IEnumerable与IDispose错误

出于某种原因,我收到三个指向类头的错误。我无法理解 a)为什么以及如何实现IDisposable b)为什么要让编译器不同意我的返回类型。

'AppAnnieImport'没有实现接口成员'System.Collections.IEnumerable.GetEnumerator()'。 'AppAnnieImport.GetEnumerator()'不能实现'System.Collections.IEnumerable.GetEnumerator()',因为它没有匹配的返回类型'System.Collections.IEnumerator'。

'AppAnnieImport' 不实现接口成员 'System.IDisposable.Dispose()'

'AppAnnieImport' 不实现接口成员 'System.Collections.Generic.IEnumerator.Current'。 'AppAnnieImport.Current'无法实现'System.Collections.Generic.IEnumerator.Current',因为它没有匹配的返回类型'AppLines'。

public class AppAnnieImport : IEnumerator<AppLines>, IEnumerable<AppLines> 
{ 
    public int code { get; set; } 
    public DateTime end_date { get; set; } 
    public string vertical { get; set; } 
    public string granularity { get; set; } 
    public string device { get; set; } 
    public List<AppLines> AppLine { get; set; } 
    private int position; 

    //IEnumerator and IEnumerable require these methods. 
    public IEnumerator<AppLines> GetEnumerator() 
    { 
     return (IEnumerator<AppLines>)this; 
    } 

    //IEnumerator 
    public bool MoveNext() 
    { 
     position++; 
     return (position < AppLine.Count); 
    } 

    //IEnumerable 
    public void Reset() 
    { position = 0; } 

    //IEnumerable 
    public object Current 
    { 
     get { return (AppLine.ToArray())[position] ; } 
    } 

} 
+0

将光标放在'的IEnumerator ',然后按Ctrl +。并选择实现接口。基本上你需要实现泛型和非泛型版本的'GetEnumerator'。 –

+0

没有什么可以增加编译器对问题的解释。 –

+0

我不会让IEnumerable和IEnumerator这两个类都实现IEnumerable,如果你需要一个自定义的IEnumerator,使它成为一个单独的类。 –

回答

2

IEnumerator<T> inherits from IDisposable,所以你必须实现它也并提供Dispose方法。

IEnumerator<T>继承自IEnumerator,所以你必须实现它,并提供返回IEnumeratorGetEnumerator()函数。

IEnumerator<T> defines a property Current which returns a T,所以你必须执行一个。


我猜的混乱源于一个事实,即从非通用版本(IEnumerableIEnumerator)通用IEnumerable<T>IEnumerator<T>继承,要求实现与名称相同,但不同的返回值类型的方法;而IEnumerator<T>继承自IDisposableIEnumerator没有。


那么,到底,你的类应该是这个样子

public class AppAnnieImport : IEnumerator<AppLines>, IEnumerable<AppLines> 
{ 
    public int code { get; set; } 
    public DateTime end_date { get; set; } 
    public string vertical { get; set; } 
    public string granularity { get; set; } 
    public string device { get; set; } 
    public List<AppLines> AppLine { get; set; } 
    private int position; 

    //IEnumerator and IEnumerable require these methods. 
    public IEnumerator<AppLines> GetEnumerator() 
    { 
     return (IEnumerator<AppLines>)this; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return (IEnumerator<AppLines>)this; 
    } 

    //IEnumerator 
    public bool MoveNext() 
    { 
     position++; 
     return (position < AppLine.Count); 
    } 

    //IEnumerable 
    public void Reset() 
    { position = 0; } 

    //IEnumerable 
    object IEnumerator.Current 
    { 
     get { return (AppLine.ToArray())[position] ; } 
    } 

    public AppLines Current 
    { 
     get { return (AppLine.ToArray())[position] ; } 
    } 

    public void Dispose() 
    { 
     // do something or not 
    } 
} 

利用显式接口实现的(也可能想摆脱重复的代码)。

+0

泰克斯,这是完美的 –

0

开始与事后再利用内部列表的方法和层在您的定制逻辑:

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    public class AppLines { } 
    public class AppAnnieImport : IEnumerator<AppLines>, IEnumerable<AppLines> 
    { 
     public int code { get; set; } 
     public DateTime end_date { get; set; } 
     public string vertical { get; set; } 
     public string granularity { get; set; } 
     public string device { get; set; } 
     public List<AppLines> appLines { get; set; } 
     private int position; 

     AppLines IEnumerator<AppLines>.Current 
     { 
      get { return ((IEnumerator<AppLines>)this.appLines).Current; } 
     } 

     public void Dispose() 
     { 
      ((IEnumerator<AppLines>)this.appLines).Dispose(); 
     } 

     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
     { 
      return this.appLines.GetEnumerator(); 
     } 

     object System.Collections.IEnumerator.Current 
     { 
      get { return ((System.Collections.IEnumerator)this.appLines).Current; } 
     } 

     public bool MoveNext() 
     { 
      return ((System.Collections.IEnumerator)this.appLines).MoveNext(); 
     } 

     public void Reset() 
     { 
      ((System.Collections.IEnumerator)this.appLines).Reset(); 
     } 

     IEnumerator<AppLines> IEnumerable<AppLines>.GetEnumerator() 
     { 
      return ((IEnumerable<AppLines>)this.appLines).GetEnumerator(); 
     } 
    } 
}