2017-01-16 10 views
-1

У меня есть класс следующим образом:Невозможно привести объект типа «InternationalRowViewDetailsModel» к типу «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; 
     } 

Но я получаю следующее сообщение об ошибке: Невозможно привести объект типа «DataBinding.Schemas.Scenario.ViewModels.InternationalRowViewDetailsModel» к типу «System.Collections.IEnumerator»

+0

return (IEnumerator) this; вы никогда не определяли счетчик. скорее вы пытаетесь применить это к IEnumerator – Steve

+0

, вам кажется, что вы хотите использовать класс InternationalRowViewDetailsModel в цикле foreach, но из кода неясно, что вы хотите получить из цикла foreach. –

+0

@ Scott Morken Я пытаюсь использовать цикл foreach и пересекать каждую строку InternationalRowViewDetailsModel. – Beginer

ответ

2

Ваш класс реализует IEnumerable:

public class InternationalRowViewDetailsModel: IEnumerable 

Но вы пытаетесь бросить его как IEnumerator:

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

Объект, который вы хотите выполнить итерацию, должен также реализовать IEnumerator, чтобы код знал, как перемещаться по вашей коллекции.

0

Вы не реализуете интерфейс правильно. Вот тип, который реализует IEnumerable:

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

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

В приведенном выше коде я просто вернув IEnumerator внутреннего списка.

Имейте в виду, что при использовании IEnumerable он выдаст элементы типа Object. Поэтому, хотя в приведенном выше примере у меня есть List<string>, при его перемещении он вернет тип Object. Попробуйте использовать общий код IEnumerable<T>, если это возможно, чтобы избежать бокса и распаковки.