Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用相同属性的多个自定义控件;接口是获取属性的最优雅的方式吗?_C#_Visual Studio_Properties_Interface_Custom Controls - Fatal编程技术网

C# 使用相同属性的多个自定义控件;接口是获取属性的最优雅的方式吗?

C# 使用相同属性的多个自定义控件;接口是获取属性的最优雅的方式吗?,c#,visual-studio,properties,interface,custom-controls,C#,Visual Studio,Properties,Interface,Custom Controls,我有多个自定义控件(从TextBox、NumericUpDown等继承),每个控件都有一个属性MaxValue if (aControl is ConfigTextBox) {maxValue = ((ConfigTextBox)aControl).MaxValue;} if (aControl is ConfigNumericUpDown) {maxValue = ((ConfigNumericUpDown)aControl).MaxValue;} etc... 我遍历表单中所有自定义控件的

我有多个自定义控件(从TextBox、NumericUpDown等继承),每个控件都有一个属性MaxValue

if (aControl is ConfigTextBox) {maxValue = ((ConfigTextBox)aControl).MaxValue;}
if (aControl is ConfigNumericUpDown) {maxValue = ((ConfigNumericUpDown)aControl).MaxValue;}
etc...
我遍历表单中所有自定义控件的列表,获取每个控件的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)
}
另一个自定义控件:

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_();
我的问题是:

  • 使用接口和使用方法获取属性是正确的处理方法吗
  • 是否有一种方法可以获取所有这些自定义控件实现的属性的值,使用字段而不是方法,而不必将每个控件强制转换为自己的类型

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

interface ConfigControl
{
     float MaxValue { get; }
}

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

完美!非常感谢。另外,我也很感激你的好意,你的回答开头是“我觉得你好像不知道……”我们在某个时候都是初学者。重要的是要记住,属性只是编译器生成函数的语法糖,这就是为什么属性可以存在于接口中,而字段不能。