延迟应用程序的所有控件,但很容易

时间:2017-02-06 16:16:04

标签: c# winforms interface controls derived-class

让我们说我的应用程序有几种形式的约300个标准控件。 有一天,事实证明,给所有控件增加成员是件好事。

必须做什么?我的想法是:

从基类中派生每种类型的Control,如下所示:

public partial class MyButton : Button, MyInterface
{
    ...
}

public partial class MyTextBox : TextBox, MyInterface
{
    ...
}

public interface MyInterface
{
    // Additional members
    ...
}

这意味着要触及每个Control来改变它

private System.Windows.Forms.Button myButton;
private System.Windows.Forms.TextBox myTextBox;

private MyButton myButton;
private MyTextBox myTextBox;

this.myButton = new System.Windows.Forms.Button();
this.myTextBox = new System.Windows.Forms.TextBox();

this.myButton = new MyButton();
this.myTextBox = new MyTextBox();

我的问题:有更简单的方法吗?也许,如果可能的话,将Control类替换为另外来自MyInterface的类? (Control.Tag属性是没有选项)

3 个答案:

答案 0 :(得分:2)

创建扩展程序提供程序似乎是一个不错的选择。 ToolTip就是一个例子;当您向表单添加ToolTip时,它会向所有控件添加ToolTip on ToolTip1字符串属性。

扩展程序提供程序为其他组件提供属性。您可以设计扩展程序组件,以将具有不同(简单或复杂)类型的某些属性添加到不同的控件类型。扩展程序提供程序提供的属性实际上驻留在扩展程序提供程序对象本身,因此它不是它修改的组件的真实属性。在设计时,属性将显示在属性窗口中。在运行时,您可以在扩展程序组件上调用getter和setter方法。

<强>资源

示例

这是一个非常简单的示例组件,它将字符串SomeProperty属性添加到TextBoxButton。该物业很简单,没有实际用途,但它是您的起点:

using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
[ProvideProperty("SomeProperty", typeof(Control))]
public class ControlExtender : Component, IExtenderProvider
{
    private Hashtable somePropertyValues = new Hashtable();
    public bool CanExtend(object extendee)
    {
        return (extendee is TextBox ||
                extendee is Button);
    }
    public string GetSomeProperty(Control control)
    {
        if (somePropertyValues.ContainsKey(control))
            return (string)somePropertyValues[control];
        return null;
    }
    public void SetSomeProperty(Control control, string value)
    {
        if (string.IsNullOrEmpty(value))
            somePropertyValues.Remove(control);
        else
            somePropertyValues[control] = value;
    }
}

答案 1 :(得分:1)

我不会这样做。控件的正常工作不会改变,只想存储一些额外的信息?我会使用一个全局字典,其中MyExtension类包含将在MyInterface中添加的所有成员。

答案 2 :(得分:1)

如果您只想添加方法,则只需使用扩展方法即可。

否则我建议您创建接口来定义一般/特定行为,这些接口的泛型实现的抽象类(经典控件的继承)以及最终使您的类继承自这些抽象类。但正如你提到的那样,你必须重命名它。 (您可以想象使用命名空间的技巧,以避免更改名称或动态地将成员添加到类中,但我不建议它。)