2017-01-16 13 views
-1

다음과 같이 나는 클래스가 :수 없습니다 'System.Collections.IEnumerator'

using System; 
using System.Collections; 
using System.Collections.Generic; 

namespace DataBinding.Schemas.Scenario.ViewModels 
{ 
    public class InternationalRowViewDetailsModel: IEnumerable 
    { 
     public InternationalRowViewDetailsModel() 
     { 
      Country = new System.Collections.Generic.Dictionary<object, object>(); 
      RateEUR = new System.Collections.Generic.Dictionary<object, object>(); 
      RateGBP = new System.Collections.Generic.Dictionary<object, object>(); 
      RateUSD = new System.Collections.Generic.Dictionary<object, object>(); 
     } 

     public Dictionary<object, object> Country { get; set; } 
     public Dictionary<object, object> RateEUR { get; set; } 
     public Dictionary<object, object> RateGBP { get; set; } 
     public Dictionary<object, object> RateUSD { get; set; } 

     public IEnumerator GetEnumerator() { return (IEnumerator)this; } 
    } 
} 

을 이제 다음과 같이 내가 InternationalRowViewDetailsModel의 값을 반복하는 것을 시도하고있다 :

foreach (InternationalRowViewDetailsModel currentRow in viewModel) 
{ 
    Row newRow = FillInternationalNumberRow(itemRow, currentRow); 
    tableNode.Rows.Add(newRow); 
} 

foreach를 사용하여 각 현재 행을 테이블의 열을 채우는 FillInternationalNumberRow 메서드로 보내고 싶습니다.

private static Row FillInternationalNumberRow(Row rowTemplate, InternationalRowViewDetailsModel internationalViewModel) 
     { 
      Row newRow = rowTemplate.Clone(true) as Row; 
      int currentCell = 0; 
      if (newRow != null) 
      { 
       newRow.Cells[currentCell++].FirstParagraph.Runs[0].Text = internationalViewModel.Country.ToString(); 
       newRow.Cells[currentCell++].FirstParagraph.Runs[0].Text = internationalViewModel.RateEUR.ToString(); 
       newRow.Cells[currentCell++].FirstParagraph.Runs[0].Text = internationalViewModel.RateGBP.ToString(); 
       newRow.Cells[currentCell++].FirstParagraph.Runs[0].Text = internationalViewModel.RateUSD.ToString(); 
      } 
      return newRow; 
     } 

하지만 다음과 같은 오류가 발생합니다 : 'System.Collections.IEnumerator'가

+0

return (IEnumerator) this; 열거자를 결코 정의하지 않았습니다. 오히려 이것을 IEnumerator – Steve

+0

으로 캐스팅하려고하면 foreach 루프에서 InternationalRowViewDetailsModel 클래스를 사용하려고하지만 코드에서 foreach 루프에서 얻고 자하는 것이 명확하지 않은 것입니다. –

+0

@ Scott Morken foreach 루프를 사용하여 각 행의 InternationalRowViewDetailsModel을 통과하려고합니다. – Beginer

답변

2

클래스는 IEnumerable를 구현 입력 유형 'DataBinding.Schemas.Scenario.ViewModels.InternationalRowViewDetailsModel'의 개체를 캐스팅 할 수 없습니다 :

public class InternationalRowViewDetailsModel: IEnumerable 

그러나 당신은 IEnumerator로 캐스팅하려는 :

public IEnumerator GetEnumerator() { return (IEnumerator)this; } 

반복 할 개체는 IEnumerator을 구현해야 코드가 컬렉션을 트래버스하는 방법을 알고 있어야합니다.

0

인터페이스를 제대로 구현하지 않습니다.

public class A : IEnumerable { 
    private List<string> items = new List<string>(); 

    public IEnumerator GetEnumerator() { 
     return this.items.GetEnumerator(); 
    } 
} 

위의 코드에서 단순히 내부 목록의 IEnumerator를 반환하고 다음은 IEnumerable를 구현하는 유형입니다.

IEnumerable을 사용할 때 Object 유형의 항목이 산출됩니다. 위의 경우에도 List<string>이 있는데,이를 통과 할 때 Object 유형이 반환됩니다. 복싱 및 언 박싱을 피하려면 가능한 한 일반 IEnumerable<T>을 사용하십시오.