将功能扩展到.NET控件

本文关键字:控件 NET 扩展到 功能 | 更新日期: 2023-09-27 18:24:35

目前我正在使用一个工具,该工具需要创建某种带有一些附加字段的自定义.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的事情。

我敢肯定还有很多比这些更好的选择。可能只是使用多态性——这一概念我仍然有问题——自定义控制类可能会被删除。你认为这些选项中哪一个是最好的?你认为这一切可以做得更好吗?

将功能扩展到.NET控件

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

通过这种方式,您可以为不同的控件提供属性,而无需先包装控件。

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

也许你可以试试这个:

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",但不使用"标记"属性