我有多个自定义控件(继承自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;
我通过使用界面笨拙地解决了这个问题;该接口定义了获取每个自定义控件属性的方法。因此,每个自定义控件都必须为每个属性定义字段和方法。
这太丑了。
(注意:方法在字段名称中添加下划线,以保持2区分。)
界面:
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_();
我的问题:
答案 0 :(得分:2)
在我看来,你不知道你可以用属性getter定义一个接口:
interface ConfigControl
{
float MaxValue { get; }
}
如果以这种方式定义接口,则实现接口的任何类必须至少具有get
属性的MaxValue
部分。由于您的所有自定义控件似乎都具有此属性,因此您不需要执行任何其他操作 - 无需MaxValue_()
方法。