多个自定义控件都使用相同的属性;获取房产是最优雅的接口?

时间:2014-07-29 17:40:01

标签: c# visual-studio properties interface custom-controls

我有多个自定义控件(继承自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_();

我的问题:

  • 使用接口并使用方法获取属性的正确方法吗?
  • 有没有办法可以使用字段而不是方法来获取所有这些自定义控件实现的属性的值,而无需将每个控件转换为自己的类型?

1 个答案:

答案 0 :(得分:2)

在我看来,你不知道你可以用属性getter定义一个接口:

interface ConfigControl
{
     float MaxValue { get; }
}

如果以这种方式定义接口,则实现接口的任何类必须至少具有get属性的MaxValue部分。由于您的所有自定义控件似乎都具有此属性,因此您不需要执行任何其他操作 - 无需MaxValue_()方法。