从枚举器检索原始类型



示例 - 我可以编写一个方法,对列表中的每个项目进行收益回报,如下所示:

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);
}

但是,如果我返回的收益回报值属于我无法轻松转换为的类型,该怎么办?

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(( 不一定知道它将返回的类型怎么办? 理想情况下,这将是一个递归搜索 UI 元素的可视化树并返回所有类型 [blank] 的子项的函数。 但是,调用test2((的人将知道他们应该返回哪种类型。

如何从通用 IEnumerator.Current 中获取 FrameworkElement 或复选框的实例?

我应该注意,虽然我知道在调用它的方法中我应该从 test2(( 中返回什么类型,但 test2(( 不一定总是返回该类型。 它可以返回任何类型的FrameworkElement,包括TextBox,Grid,Border等。 我最好在不修改 test2(( 返回的内容或至少保持通用的情况下执行此操作。

您的第一选择是使用通用版本IEnumerator<CheckBox>

public static IEnumerator<CheckBox> test1()
{
CheckBox checkbox1 = new CheckBox();
CheckBox checkbox2 = new CheckBox();
CheckBox checkbox3 = new CheckBox();
List<CheckBox> list = new List<CheckBox> { checkbox1, checkbox2, checkbox3 };
foreach (var entry in list)
{
yield return entry;
}
}

但是您也可以轻松使用IEnumerable<CheckBox>,它也具有其优势(取决于您的需求(

public static IEnumerable<CheckBox> test2()
{
CheckBox checkbox1 = new CheckBox();
CheckBox checkbox2 = new CheckBox();
CheckBox checkbox3 = new CheckBox();
List<CheckBox> list = new List<CheckBox> { checkbox1, checkbox2, checkbox3 };
foreach (var entry in list)
{
yield return entry;
}
}

用法

var testEnumerator = test1();
while (testEnumerator.MoveNext())
{
// i am a CheckBox
CheckBox checkBox = testEnumerator.Current;
}
foreach (var item in test2())
{
// i am a CheckBox also
CheckBox checkBox = item;
}

其他资源

IE可枚举接口

公开枚举器,该枚举器支持对 指定类型的集合。

枚举器接口

支持对泛型集合进行简单迭代。

我想通了(部分基于我在这些评论和答案中看到的一些线索(。

首先,让 test2(( 返回一个 FrameworkElements 的 IEnumerator 而不是一个泛型的枚举器:

IEnumerator<FrameworkElement> 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;
}
}

其次,我可以在返回结果后使用此转换从 FrameworkElement 切换到更具体的类型:

IEnumerator<FrameworkElement> testEnumerator2 = test2();
while (testEnumerator2.MoveNext())
{
System.Windows.Controls.CheckBox checkbox = (System.Windows.Controls.CheckBox)testEnumerator2.Current;
Console.WriteLine(checkbox.IsChecked);
}

最新更新