質問

次のコードでは、ネストされた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 ステートメントは列挙変数をキャストできます:

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

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

これは、列挙内のボタンの all Button から派生したものよりも MySpecialButton 型である限り機能します。わからない場合は、次のように MySpecialButton タイプのボタンのみを列挙できます。

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

OfType は、オブジェクトがターゲット型にキャストできない型の場合に例外をスローするのではなく、列挙をフィルターするという点で Cast とは異なります。

foreach内のスーパータイプ(コントロール)で使用可能な値のみを参照する場合は、コントロールとして宣言します。

型固有のロジックがある場合は、Controlとして宣言する必要がありますが、各反復で処理している型を特定し、キャストと条件付きロジックを使用します。

それを行う1つの方法は、foreachの本体を一連のメソッド(つまり、Update(Button)、Update(KryptonTextBox))にリファクタリングし、Update(c)を呼び出すことです。

foreach変数はリストタイプと一致する必要があります。

foreach(Control c in controls)

または

foreach(Object c in controls)

型のリストをgetControlsに渡すので、その型のコントロールのみが返されると推測していますが、そうでない場合は型を検証する必要があります

if(t.IsAssignableFrom(c))

その後、リフレクションを使用してプロパティを設定する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top