すべてのControl
オブジェクトにはText
プロパティがあるため、リフレクションを使用してそれを決定しても意味がありません。常に返されtrue
ます。
実際の問題は、一部のコントロールがText
サポートしていないため、プロパティから例外をスローすることです。
事前にわからないカスタム コントロールも使用できるようにする場合は、現在のソリューションに固執し、例外をキャッチする必要があります。ただし、たとえば、スローされた特定の例外をキャッチする必要がありますNotSupportedException
。
事前にわかっているコントロールしか見つからない場合は、機能するプロパティがあることがわかっているコントロールを選択できますText
。例えば:
public static bool HasWorkingTextProperty(Control control)
{
return control is Label
|| control is TextBox
|| control is ComboBox;
}
var controlsWithText = from c in this.Controls
where HasWorkingTextProperty(c)
select c;
foreach(var control in controlsWithText)
{
string text = control.Text;
// Do something with it.
}
また、プロパティを持つ場合と持たない場合がある独自のカスタム コントロールを実装する場合はText
、次のことを示す基本クラスからそれらを派生させることができます。
public abstract class CustomControlBase : Control
{
public virtual bool HasText
{
get { return false; }
}
}
public class MyCustomControl : CustomControlBase
{
public override bool HasText
{
get { return true; }
}
public override string Text
{
get { /* Do something. */ }
set { /* Do something. */ }
}
}
public static bool HasWorkingTextProperty(Control control)
{
return (control is CustomControlBase && ((CustomControlBase)control).HasText)
|| control is Label
|| control is TextBox
|| control is ComboBox;
}