代码之家  ›  专栏  ›  技术社区  ›  Luiscencio

foreach变量的动态类型

  •  -1
  • Luiscencio  · 技术社区  · 15 年前

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

    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;
      }    
    }
    
    4 回复  |  直到 15 年前
        1
  •  4
  •   devio    15 年前

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

    因此编译器只允许您

    foreach(Control c in controls)
    

    但是在foreach块中,可以使用类型转换来调用特定类型的方法:

    {
        if (c is MyControlType)
            (c as MyControlType).StateCommon.Back.Color1 = Color.White;
    }
    
        2
  •  7
  •   Sam Harwell    15 年前

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

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

    只要这个能用 全部的 枚举中的按钮类型为 MySpecialButton 源于 Button . 如果您不知道,那么您只能枚举类型的按钮 MySimulink 这样地:

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

    OfType 不同于 Cast 因为当对象的类型不能转换为目标类型时,它过滤枚举而不是抛出异常。

        3
  •  1
  •   technophile    15 年前

    如果只引用foreach内部的父类型(控件)上可用的值,那么只需将其声明为控件。

    如果您有特定于类型的逻辑,那么您仍然需要将其声明为控件,然后找出在每个迭代中要处理的类型,并使用强制转换和条件逻辑。

    一种方法是将foreach的主体重构为一组方法(即update(按钮)、update(kryptoxtbox)),然后调用update(c)。

        4
  •  1
  •   Mike J    15 年前

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

    foreach(Control c in controls)
    

    foreach(Object c in controls)
    

    我猜想,由于您将类型列表传递给getcontrols,它只返回该类型的控件,但如果不返回,则需要验证该类型

    if(t.IsAssignableFrom(c))
    

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