【问题标题】:Multiple custom controls all using the same properties; is an interface the most elegant way to get a property?多个自定义控件都使用相同的属性;接口是获取属性的最优雅方式吗?
【发布时间】: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


    【解决方案1】:

    在我看来,您似乎不知道可以使用属性 getter 定义接口:

    interface ConfigControl
    {
         float MaxValue { get; }
    }
    

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

    【讨论】:

    • 完美!谢谢你。另外,我很感谢你以“在我看来你不知道......”开始你的回答。
    • 在某些时候我们都是初学者。重要的是要记住,属性只是编译器生成的函数周围的语法糖,这就是为什么属性可以存在于接口中而字段不能存在的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2023-03-08
    • 2011-08-10
    • 2011-11-11
    • 2014-03-05
    • 2010-12-04
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多