【问题标题】:Expanding functionality to .NET Controls将功能扩展到 .NET 控件
【发布时间】:2012-02-15 13:06:45
【问题描述】:

目前我正在使用一种工具,该工具需要创建某种带有一些附加字段的自定义 .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 字段添加到标签控件。这样我们确保了封装性和可维护性,但我们避免了Tag 的事情。

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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我也看看这个。
    【解决方案2】:

    如果我理解正确,我更愿意在这里使用扩展方法。如果您需要为每个控件存储一些自定义值 - 您可以将它们存储在静态字典 (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();
    

    【讨论】:

    • 拥有某种字典听起来也是一个很好的解决方案,如果我没记错的话,不需要扩展 .NET 控件。会看看扩展方法,因为这是我不知道的东西。
    【解决方案3】:

    也许你可以试试这个:

    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”,但不使用“标签”属性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多