【问题标题】:inheriting a read-only property继承只读属性
【发布时间】:2015-02-18 06:24:48
【问题描述】:

在 Microsoft 文档中,Control 类的只读属性 Controls 的声明如下:

[BrowsableAttribute(false)]
public Control.ControlCollection Controls { get; }

我继承了这个属性。并隐藏它:

[EditorBrowsable(EditorBrowsableState.Never)]
[BrowsableAttribute(false)]
[ComVisible(false)]
public new Control.ControlCollection Controls { get; }

但这不能编译? 错误:“UserControl1.Controls.get”必须声明一个主体,因为它没有标记为抽象或外部。自动实现的属性必须同时定义 get 和 set 访问器。

所以我改了:

[EditorBrowsable(EditorBrowsableState.Never)]
[BrowsableAttribute(false)]
[ComVisible(false)]
public new Control.ControlCollection Controls { 
    get { return null; } }

编译。但我需要一些属性功能,而不是完全取消它。 (我必须向这篇文章的早期回复者道歉,因为我在这里进行了大量编辑。)(在 30 秒内!!)
我必须更改我的脚本...所以我尝试:

[EditorBrowsable(EditorBrowsableState.Never)]
[BrowsableAttribute(false)]
[ComVisible(false)]
public new Control.ControlCollection Controls { get; private set; }

这也不会编译:错误:“UserControl1.Controls.set”访问器的可访问性修饰符必须比属性或索引器“UserControl1.Controls”更具限制性

对此该怎么办?

【问题讨论】:

  • 当您使用new 时,您并未继承该属性,而是隐藏了父级的定义。
  • 第一部分你只得到了房产,那么你会得到什么回报?
  • @Pierre-LucPineault ...编辑了那个。隐藏。我想要的是隐藏。所以 { get return null; } 哪个有效。但现在是一团糟。
  • 一团糟,真的很有帮助。也许你想要返回 base.Controls ?
  • @PhilipStuyck 应该这样做。感谢您恢复订单!

标签: c# .net


【解决方案1】:

这是我的建议。

[EditorBrowsable(EditorBrowsableState.Never)]
[BrowsableAttribute(false)]
[ComVisible(false)]
public new Control.ControlCollection Controls { 
    get { return base.Controls; } }

【讨论】:

  • 是的,特别是如果他只想获取并且如果他想设置它比没有只读的意义...... :)
  • 当然!另外我看到 Controls 属性实际上是写 public ControlCollection Controls { get { ControlCollection controlsCollection = (ControlCollection)Properties.GetObject(PropControlsCollection); if (controlsCollection == null) { controlsCollection = CreateControlsInstance(); Properties.SetObject(PropControlsCollection, controlsCollection); } 返回控件集合; } }
猜你喜欢
  • 1970-01-01
  • 2011-11-16
  • 2015-07-17
  • 1970-01-01
  • 2021-12-14
  • 2011-08-11
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多