C# foreach变量的动态类型
在下面的代码中,如何将变量类型传递给嵌套的foreach语句? getControls是一个递归函数,返回控件列表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
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))