所有Control
对象都有一个Text
property,因此使用反射来确定它是没有意义的。它总会回来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;
}