コードの問題は、すべての型がプロパティを持つわけではなく、任意のT
型になる可能性があることです。したがって、コンパイラはチョークします。ReadOnly
これを行うためにジェネリックを使用する必要はありません。
private void SetReadOnly(Control parent, bool readOnly)
{
// Get all TextBoxes and set the value of the ReadOnly property.
foreach (var tb in parent.Controls.OfType<TextBox>())
tb.ReadOnly = readOnly;
// Recurse through all Controls
foreach(Control c in parent.Controls)
SetReadOnly(c, readOnly);
}
ただし、ジェネリックを使用したい場合は、次のようにできます。
private void SetReadOnly<T>(Control parent, bool readOnly) where T : TextBox
{
// Get all TextBoxes and set the value of the ReadOnly property.
foreach (var tb in parent.Controls.OfType<T>())
tb.ReadOnly = readOnly;
// Recurse through all Controls
foreach(Control c in parent.Controls)
SetReadOnly<T>(c, readOnly);
}
これにより、ジェネリック型TextBox
またはその派生クラスが制約されます。これにより、プロパティが常にそこにあることが保証されReadOnly
、コンパイラはこれを認識します。