Frage

Im folgenden Code: Wie kann ich pass den Typen des Variable in der verschachtelten foreach-Anweisung? getControls ist eine rekursive Funktion, die eine Liste der Steuerelemente zurückgibt (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;
  }    
}
War es hilfreich?

Lösung

Die Iterieren Variable muss von einem kompatiblen Typ der Liste Elementtypen sein.

So wird nur der Compiler ermöglicht es Ihnen schreiben

foreach(Control c in controls)

, aber innerhalb der foreach-Block, können Sie Typ Methoden eines bestimmten Typs nennen wirft:

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

Andere Tipps

Die foreach Anweisung kann die Aufzählung Variable Stimmen:

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

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

Dies wird solange alle der Schaltflächen in der Aufzählung arbeiten, sind vom Typ MySpecialButton als ergibt sich aus Button. Wenn Sie nicht wissen, dass, dann können Sie nur die Schaltflächen des Typs MySpecialButton wie folgt aufzählen über:

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

OfType unterscheidet sich von Cast, dass sie die Aufzählung filtert, anstatt eine Ausnahme auszulösen, wenn ein Objekt von einem Typ ist, der nicht in den Zieltyp umgewandelt werden kann.

Wenn Sie nur Werte auf dem Supertyp (Control) innerhalb der foreach verweisen, dann erklärt nur als Kontrolle.

Wenn Sie typspezifische Logik haben, müssen Sie es noch als Kontrolle erklären, aber dann herauszufinden, welcher Typ Sie mit in jeder Iteration zu tun hat und die Verwendung wirft und bedingte Logik.

Eine Möglichkeit, das zu tun ist, den Körper des foreach in eine Reihe von Methoden (d-Update (Button), Update (KryptonTextBox)) und rufen Sie einfach Update (c) Refactoring.

Der foreach-Variable muss die Liste Typen entsprechen.

foreach(Control c in controls)

oder

foreach(Object c in controls)

Ich vermute, dass da Sie in der Liste der Typen getControls passieren, dass es nur Kontrollen dieser Art gibt, aber wenn nicht, müssen Sie die Art validieren

if(t.IsAssignableFrom(c))

Sie müßten dann Reflektion verwenden, um die Eigenschaften einzustellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top