使用哪种设计模式可以为类提供额外的属性?

4
当您在窗体上有一个 TableLayoutPanel 并将 Label 拖入单元格中时,Label 控件上会有几个可用属性。我认为当您将 Tooltip 控件拖到窗体上时,使用的是相同的构造。
我想知道使用的是哪种设计模式来实现这一点。这是装饰器模式吗?

你的意思是只有在TableLayoutPanel标签中才能看到的属性吗? - Tigran
2个回答

7
你所看到的被称为扩展提供程序
例如,当将ToolTip组件添加到表单中时,它会为该表单上的每个控件提供一个名为ToolTip的属性。然后,ToolTip属性会出现在任何附加的PropertyGrid控件中。http://msdn.microsoft.com/en-us/library/ms171836.aspx 我无法想到一个描述它们如何工作的著名模式,但机制很简单。
你必须实现IExtenderProvider。WinForms Designer将为表面上的每个其他控件调用CanExtend,并且你的扩展程序可以指定是否为每个控件提供其他属性。
public interface IExtenderProvider {
    bool CanExtend(object extendee);
}

其他控件将被扩展的实际属性是使用ProvidePropertyAttribute提供值的方法声明的。


似乎是针对WinForms设计时的WPF附加属性实现。 - Tigran
“pattern” 是多态 :) - Tigran
@Tigran:我不认为我会这么说,因为你没有子类化和重写实现。它可能有访问者的暗示,通过调用CanExtend来检查每个控件 - 但是它不是真正的访问者,因为它依赖于在CanExtend方法中进行类型检查。扩展属性如何在设计器中的属性网格中实际公开也是一种未知的内部机制(实际上有一篇旧的MSDN文章详细介绍了它)。 - quentin-starin

1
不,这不是通过设计模式实现的。这些属性只是控件公开的属性,这些属性是通过继承添加到控件中的,即它们是子类Control。 Visual Studio设计器检查实现这些控件的类以确定其公开的属性,然后为您提供UI来设置它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接