C# foreach变量的动态类型

C# foreach变量的动态类型,c#,foreach,C#,Foreach,在下面的代码中,如何将变量类型传递给嵌套的foreach语句? getControls是一个递归函数,返回控件列表 getControls(String type, Control donde) var tipos = new List<Type>() { typeof(Button), typeof(KryptonTextBox) }; foreach (Type t in tipos) { List<Control> controls = getContr

在下面的代码中,如何将变量类型传递给嵌套的foreach语句? getControls是一个递归函数,返回控件列表

getControls(String type, Control donde)  

var tipos = new List<Type>() { typeof(Button), typeof(KryptonTextBox) };

foreach (Type t in tipos)
{
  List<Control> controls = getControls(t.ToString(), this);
  foreach (***** c in controls)
  {
    c.StateCommon.Back.Color1 = Color.White;
  }    
}

迭代变量的类型必须与列表项类型兼容

因此,编译器只允许您编写

foreach(Control c in controls)
但是在foreach块内部,可以使用类型转换来调用特定类型的方法:

{
    if (c is MyControlType)
        (c as MyControlType).StateCommon.Back.Color1 = Color.White;
}

如果只引用foreach内部的超类型控件上可用的值,则只需将其声明为控件

如果您有特定于类型的逻辑,您仍然需要将其声明为控件,但随后要确定在每次迭代中处理的是哪种类型,并使用强制转换和条件逻辑

一种方法是将foreach主体重构为一组方法,即UpdateButton、UpdateKryptonTextBox,然后只调用Updatec。

foreach语句可以强制转换枚举变量:

IEnumerable objects = ...;
foreach (AnyTypeHere i in objects)
    ...

IEnumerable<Button> buttons = ...;
foreach (MySpecialButton button in buttons)
    ...

OfType与强制转换的不同之处在于,当对象属于无法强制转换为目标类型的类型时,它会过滤枚举,而不是引发异常。

foreach变量需要与列表类型匹配

foreach(Control c in controls)

我猜想,既然您将类型列表传递给getControls,那么它只返回该类型的控件,如果不返回,则需要验证该类型

if(t.IsAssignableFrom(c))

然后需要使用反射来设置属性。

Um。。。按钮没有StateCommon成员。您将无法在返回的按钮上运行该代码。@Joel您不知道按钮的实际类型,所以这很难说清楚。我不会使用异常处理来控制流:p只需使用is运算符来确保对象是您要查找的类型。-1:另外,语法上允许您将is/as放在块中,这是完全错误的。首先,foreach变量的兼容性可以包括up、down或接口转换。第二,当您使用is/as时,您应该使用as,后跟null检查。这是一种很好的方法。OfType扩展方法对于不同类型的列表非常方便。
foreach(Object c in controls)
if(t.IsAssignableFrom(c))