将功能扩展到.NET控件

时间:2012-02-15 13:06:46

标签: c# .net winforms

目前,我正在开发一种工具,需要使用一些额外的字段来创建某种自定义的.NET。我一直想知道什么方法可以更好地解决这个问题,并且一直在考虑以下方案:

选项A: - 为每个控件创建一个派生类(比方说,CLabel,CGroupBox ......),我在每个类上定义新字段。这意味着更糟糕的可持续性,但很容易用操作。

示例:

class CLabel: Label
{
    public List<Control> RelatedControls {get; set;}
    public String textHint;
    // more stuff...

    public CLabel()
    {}
 }

选项B: - 此选项意味着不从每个控件创建派生类,而是使用实际的Label,GroupBox等控件并创建封装所有“额外”属性的类。这个额外的属性对象将在Control.Tag属性中引用。我对这个问题有疑问,因为在Tag属性中引用一种复杂的对象对我来说感觉有点蹩脚,但是这个意味着更好的可持续性,当然也不需要子类化控件

示例:

Label lbl = new Label();
lbl.Tag = new ControlDescription();

选项C: - 这意味着具有选项A和B的某种组合。只需创建自定义控件,例如CLabel,即将类型ControlDescription字段添加到Label控件。这样我们就可以确保封装和可持续性,但是我们避免使用Tag

我很确定有很多选择比那些更好。可能只是使用多态 - 一个我仍然遇到问题的概念 - 可以取消自定义控件类。您认为哪些选项最好?你认为所有这些都可以做得更好吗?

3 个答案:

答案 0 :(得分:2)

如果您需要在设计时轻松控制属性,并且必须使用Windows窗体,则应该锁定此http://msdn.microsoft.com/en-us/library/system.componentmodel.iextenderprovider.aspx

这样,您可以为不同的控件提供属性,而不必将它们包装在第一个控件中。

答案 1 :(得分:1)

如果我正确理解你,我宁愿在这里使用扩展方法。如果您需要为每个控件存储一些自定义值 - 您可以将它们存储在静态字典(Control,Value)中,但使用扩展方法来访问它,因此看起来您有控件添加了一些值。

添加了一个示例:

public static class Extension
{
    private static Dictionary<Control, string> _controlStrings;

    public static void GetString(this Control ctrl)
    {
        return _controlStrings[ctrl];
    }
 }

之后您可以使用以下方法:

Button btn = new Button();
string s = btn.GetString();

答案 2 :(得分:0)

可能你可以试试这个:

public class ExtensionData
{
    //put your data here
}

public class Extended<T>
    where T : Control
{
    public Extended( T baseControl )
    {
        BaseControl = baseControl;
    }

    public T BaseControl { get; set; }

    public ExtensionData Extension { get; set; }
}

这就像你的“选项B”,但没有使用“标签”属性