C# 从IEnumerator检索原始类型
示例-我可以编写一个方法,对列表中的每个项目进行收益回报,如下所示:C# 从IEnumerator检索原始类型,c#,type-conversion,ienumerator,C#,Type Conversion,Ienumerator,示例-我可以编写一个方法,对列表中的每个项目进行收益回报,如下所示: IEnumerator test1() { List<int> list = new List<int> { 0, 1, 2, 3, 4 }; foreach (int entry in list) { yield return entry; } } IEnumerator testEnumerator = test1(); while (testE
IEnumerator test1()
{
List<int> list = new List<int> { 0, 1, 2, 3, 4 };
foreach (int entry in list)
{
yield return entry;
}
}
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;
}
}
IEnumerator test2()
{
System.Windows.Controls.CheckBox checkbox1=新建System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox2=新建System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox3=新建System.Windows.Controls.CheckBox();
列表列表=新列表{checkbox1,checkbox2,checkbox3};
foreach(列表中的FrameworkElement条目)
{
收益回报分录;
}
}
此外,如果test2()不一定知道它将返回的类型,该怎么办?理想情况下,这将是一个递归搜索UI元素的可视树并返回[blank]类型的所有子元素的函数。然而,调用test2()的人将知道他们应该返回什么类型
如何从通用IEnumerator.Current中获取FrameworkElement或复选框的实例
我应该注意到,虽然我知道应该从调用它的方法中的test2()返回什么类型,但test2()并不一定总是返回该类型。它可以返回任何类型的FrameworkElement,包括TextBox、Grid、Border等。我希望这样做时不修改test2()返回的内容,或者至少保持它的通用性。您的第一选择是使用通用版本
IEnumerator
其他资源
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;
}
公开枚举数,该枚举数支持对
指定类型的集合
支持对泛型集合进行简单迭代
您的第一选择是使用通用版本
IEnumerator
其他资源
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;
}
公开枚举数,该枚举数支持对
指定类型的集合
支持对泛型集合进行简单迭代
我找到了答案(部分基于我在这些评论和答案中看到的一些线索)
首先,让test2()返回框架元素的IEnumerator,而不是通用的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;
}
}
IEnumerator test2()
{
System.Windows.Controls.CheckBox checkbox1=新建System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox2=新建System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox3=新建System.Windows.Controls.CheckBox();
列表列表=新列表{checkbox1,checkbox2,checkbox3};
foreach(列表中的FrameworkElement条目)
{
收益回报分录;
}
}
其次,在返回结果后,我可以使用此转换从FrameworkElement切换到更具体的类型:
IEnumerator<FrameworkElement> testEnumerator2 = test2();
while (testEnumerator2.MoveNext())
{
System.Windows.Controls.CheckBox checkbox = (System.Windows.Controls.CheckBox)testEnumerator2.Current;
Console.WriteLine(checkbox.IsChecked);
}
IEnumerator testEnumerator2=test2();
while(testEnumerator2.MoveNext())
{
System.Windows.Controls.CheckBox=(System.Windows.Controls.CheckBox)testEnumerator2.Current;
Console.WriteLine(checkbox.IsChecked);
}
我找到了答案(部分基于我在这些评论和答案中看到的一些线索)
首先,让test2()返回框架元素的IEnumerator,而不是通用的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;
}
}
IEnumerator test2()
{
System.Windows.Controls.CheckBox checkbox1=新建System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox2=新建System.Windows.Controls.CheckBox();
System.Windows.Controls.CheckBox checkbox3=新建System.Windows.Controls.CheckBox();
列表列表=新列表{checkbox1,checkbox2,checkbox3};
foreach(列表中的FrameworkElement条目)
{
收益回报分录;
}
}
其次,在返回结果后,我可以使用此转换从FrameworkElement切换到更具体的类型:
IEnumerator<FrameworkElement> testEnumerator2 = test2();
while (testEnumerator2.MoveNext())
{
System.Windows.Controls.CheckBox checkbox = (System.Windows.Controls.CheckBox)testEnumerator2.Current;
Console.WriteLine(checkbox.IsChecked);
}
IEnumerator testEnumerator2=test2();
while(testEnumerator2.MoveNext())
{
System.Windows.Controls.CheckBox=(System.Windows.Controls.CheckBox)testEnumerator2.Current;
Console.WriteLine(checkbox.IsChecked);
}
您可以使用它。您是否知道项目的类型?使用通用IEnumerator如何?@SLaks:谢谢,但我无法想象您所描述的内容。我希望能有一些例子。@scegg:test2()不知道它将返回什么(它可以是从FrameworkElement继承的任何类型),但调用方知道它要求复选框。您可以强制转换它。您是否知道项目的类型?使用通用IEnumerator如何?@SLaks:谢谢,但我无法想象您所描述的内容。我希望有一些例子。@scegg:test2()不知道它将返回什么(它可以是从FrameworkElement继承的任何类型),但调用方知道它要求选中复选框。谢谢。如果test2()总是返回复选框,这将非常有效,但也可以是TextBox、Grid或任何其他FrameworkElement。理想情况下,我希望能从调用者方法中找到解决问题的方法。虽然这不是我想要的,但它确实让我走上了解决问题的正确道路。再次感谢,谢谢。如果test2()总是返回复选框,这将非常有效,但也可以是TextBox、Grid或任何其他FrameworkElement。理想情况下,我希望能从调用者方法中找到解决问题的方法。虽然这不是我想要的,但它确实让我走上了解决问题的正确道路。再次感谢。我仍然不明白:如果您在编译时知道硬的、未经检查的对复选框的强制转换成功,为什么不首先创建IEnumerable或IEnumerator?@gdir:如果我声明“IEnumerator testEnumerator2=test2()”,它会抛出一个类型不匹配错误,因为test2()返回类型IEnumerator。我仍然不知道