我的项目中的许多表单都从基本表单继承。很容易得到派生表单的Controls集合,但我没有找到一种访问Components集合的简单方法,因为VS将其标记为私有。
我认为这可以通过反射来完成,但我不确定如何最好地解决它,而不是之前没有使用过反射。
现在,我正在使用一种笨重的解决方法,我在其中覆盖一个函数GetComponents并返回我感兴趣的组件数组。这显然容易出错,因为它很容易忘记实现覆盖的函数或在添加组件时更新它。
如果有人有任何提示或可以提出更好的方法,我会很高兴听到。
答案 0 :(得分:1)
如果将组件的Modifiers属性设置为strict protected,则可以在不使用组件集合的情况下访问它们。
编辑: 可发现性可以使用反射来遍历每个字段。虽然在您的情况下这可能不是最理想的。
答案 1 :(得分:0)
如果您担心忘记覆盖该功能,请将其抽象化。
答案 2 :(得分:0)
在基本表单类中将“components”修饰符设置为protected。删除所有派生表单中的“组件”声明。
在基本表单加载事件
中调用以下方法 public void SetComponentsStyle()
{
if (null != this.components)
{
foreach (Component comp in this.components.Components)
{
if (comp is ToolTip)
{
}
else if (comp is ContextMenuStrip)
{
}
}
}
}