Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从IEnumerator检索原始类型_C#_Type Conversion_Ienumerator - Fatal编程技术网

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。我仍然不知道