如何确定控件是否具有文本属性
本文关键字:文本 属性 是否 何确定 控件 | 更新日期: 2023-09-27 18:02:20
当我在一个表单上迭代一堆不同的控件时,而不是尝试访问Text属性:
String text = String.Empty;
foreach(Control control in this.Controls)
{
try
{
text = control.Text;
}
catch(Exception exception)
{
// This control probably doesn't have the Text property.
Debug.WriteLine(exception.Message);
}
}
是否有一种方法来确定是否给定的控件有文本属性?像这样:
String text = String.Empty;
foreach(Control control in this.Controls)
{
if(control has Text property)
{
text = control.Text;
}
}
我绝对讨厌Try/Catch块(当然,除非没有更好的替代方法)。
所有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;
}
您的问题是如何确定控件是否具有文本属性,所以这里是如何使用反射:
control.GetType().GetProperties().Any(x => x.Name == "Text");
编辑:如果你看一下Control
类,你会发现它有一个Text
属性。
现在,如果一些覆盖Control
类的自定义控件在访问Text
属性时抛出异常,它违反了Liskov替换原则。在这种情况下,我建议您识别这些控件,尽管您正在做的事情似乎很好。
看看这个:
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
{
PropertyInfo[] properties = ctrl.GetType().GetProperties();
foreach(PropertyInfo pi in properties)
if (pi.Name == "Text")
{
//has text
}
}
}