【问题标题】:Setting a property hidden by control's interface设置控件界面隐藏的属性
【发布时间】:2011-05-18 19:15:03
【问题描述】:

我正在尝试设置 System.Web.UI.Control 对象的 ID 字段。该控件实现了一个接口 IChartControl,它没有 ID 属性。我想将控件检索为 IChartControl 并设置其 ID 字段。

我应该这样做吗?:

IChartControl chartControl = foo.GetChartControl();
(chartControl as Control).ID = foo.GetID();
chartControl.Bar();

或者向 IChartControl 添加一个名为“ID”的新属性是否同样正确,这样当我设置 ID 字段时,它会设置 Control 的 ID 字段。

【问题讨论】:

  • 如果你这样转换,如果chartControl 不是Control,你会得到一个空引用异常。只是说。

标签: c# interface casting


【解决方案1】:

您确实需要将对象转换为具有您要设置的成员的类型,就像您在代码示例中所做的那样。

ID 属性添加到IChartControl 将起作用,但只有在此接口的上下文中有意义时才这样做。这确实允许您设置 ID 属性而不需要强制转换。

只要界面中的IDControl 相同,就可以了。如果您尝试使用explicit interface implementations,您可能会遇到麻烦。

【讨论】:

  • 为什么会冲突?只要签名匹配,将 IChartControl 添加到派生自 Control 的类只会“自动”实现其 ID 成员。
  • @dlev - 你说的很对。我正在考虑显式接口实现,这取决于类的实现方式可能会产生令人惊讶的结果。
  • 非常正确。试图编辑我的评论以响应您的编辑,但显然您只能编辑 cmets 5 分钟。现在我看起来很傻!
  • @dlev - 人们仍然可以看到我的编辑,而且时不时看起来很傻也没有错;)
【解决方案2】:

如果您认为所有 IChartControl 实现都应该支持检索 ID 值,则应仅向 IChartControl 添加 ID 字段。如果是这样,那么添加它是有道理的。如果没有,那么as 语句就可以了(尽管有风险,因为GetChartControl() 只保证一个对象可能有也可能没有ID,并且可能是也可能不是控件。)

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2014-12-30
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多