【发布时间】:2014-07-29 17:40:01
【问题描述】:
我有多个自定义控件(继承自 TextBox、NumericUpDown 等),每个控件都有一个属性 MaxValue。
我遍历表单中所有自定义控件的列表,获取每个控件的 MaxValue,而不考虑控件的类型。
我可以遍历每个控件类型,查看给定控件是否属于该类型,将控件强制转换为该类型,并获取其 MaxValue。
if (aControl is ConfigTextBox) {maxValue = ((ConfigTextBox)aControl).MaxValue;}
if (aControl is ConfigNumericUpDown) {maxValue = ((ConfigNumericUpDown)aControl).MaxValue;}
etc...
不需要查看每种类型并在一行中完成会更简洁:
float maxValue = aControl.MaxValue;
我通过使用界面笨拙地解决了这个问题;该接口定义了获取每个自定义控件的属性的方法。因此,每个自定义控件都必须为每个属性定义一个字段和一个方法。
这太丑了。
(注意:方法会在字段名称后添加下划线,以保持两者的区别。)
界面:
interface ConfigControl
{
float MaxValue_();
...(more methods, one per property)
}
其中一个自定义控件:
public partial class ConfigTextBox : TextBox, ConfigControl
{
private float maxValue = 10;
....
// Maximum
[DefaultValueAttribute(10), Description("The maximum value that can be entered in this setting"), Category("Data")]
public float MaxValue
{
get { return maxValue; }
set { maxValue = value; }
}
public float MaxValue_() { return maxValue; }
.... (more properties)
}
另一个自定义控件:
public partial class ConfigNumericUpDown : NumericUpDown, ConfigControl
{
private float maxValue = 10;
....
// Maximum
[DefaultValueAttribute(10), Description("The maximum value that can be entered in this setting"), Category("Data")]
public float MaxValue
{
get { return maxValue; }
set { maxValue = value; }
}
public float MaxValue_() { return maxValue; }
.... (more properties)
}
获取最大值:
float maxValue = ((ConfigControl)aControl).MaxValue_();
我的问题:
- 使用接口并通过方法获取属性是处理此问题的正确方法吗?
- 有没有一种方法可以让我使用字段而不是方法来获取所有这些自定义控件实现的属性的值,而不必将每个控件转换为自己的类型?
【问题讨论】:
标签: c# visual-studio properties interface custom-controls