Пример - я могу написать метод, который возвращает доход по каждому элементу в списке, например:
IEnumerator test1()
{
List<int> list = new List<int> { 0, 1, 2, 3, 4 };
foreach (int entry in list)
{
yield return entry;
}
}
Возвращает результаты в IEnumerator, который хранит каждый результат как объект. Я все еще могу вернуть целые числа с преобразованием, хотя, как это:
IEnumerator testEnumerator = test1();
while (testEnumerator.MoveNext())
{
int i = Convert.ToInt32(testEnumerator.Current);
Console.WriteLine(i);
}
Однако, что если значения, которые я возвращаю с помощью yield return, относятся к типу, в который я не могу легко преобразовать?
IEnumerator test2()
{
System.Windows.Controls.CheckBox checkbox1 = new System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox2 = new System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox3 = new System.Windows.Controls.CheckBox();
List<System.Windows.Controls.CheckBox> list = new List<System.Windows.Controls.CheckBox> { checkbox1, checkbox2, checkbox3 };
foreach (FrameworkElement entry in list)
{
yield return entry;
}
}
Кроме того, что если test2 () не обязательно знает тип, который он будет возвращать? В идеале это была бы функция для рекурсивного поиска визуального дерева элементов пользовательского интерфейса и возврата всех дочерних элементов типа [blank]. Однако человек, вызывающий test2 (), будет знать, к какому типу он должен возвращаться.
Как я могу получить экземпляр FrameworkElement или Checkbox обратно из универсального IEnumerator.Current?
Я должен отметить, что хотя я знаю, какой тип мне следует возвращать из test2 () в вызывающем его методе, test2 () не всегда возвращает этот тип. Он может вернуть любой тип FrameworkElement, включая TextBox, Grid, Border и т. Д. Я бы предпочел сделать это без изменения того, что возвращает test2 (), или хотя бы оставить его универсальным.