【问题标题】:Extending ASP.NET WebControls: How to effectively hide public properties扩展 ASP.NET WebControls:如何有效地隐藏公共属性
【发布时间】:2009-10-06 12:57:02
【问题描述】:

我将 TextBox WebControl 扩展为一种“DateTextBox”,它在代码隐藏中将其值作为属性 (DateValue) 公开:

public sealed class DateTextBox : TextBox
{
    public DateTime ?DateValue
    {
        /* ToDateFromUserInterface() and ToUserInterfaceString() are both
           extension methods */

        get
        {
            return
            (
                String.IsNullOrEmpty(Text) ?
                new DateTime?() :
                Text.ToDateFromUserInterface()
            );
        }

        set
        {
            if (value != null) Text = ((DateTime)value).ToUserInterfaceString();
        }
    }
}

鉴于此控件仅应与日期一起使用,因此没有理由从其父级继承 Text 属性。

有没有办法隐藏它?.. 除了实现NotImplementedException,像这样:

new public String Text
{
    get { throw new NotImplementedException(); }
    set { throw new NotImplementedException(); }
}

【问题讨论】:

    标签: c# asp.net extensibility web-controls


    【解决方案1】:

    只需覆盖它并提供日期的字符串版本。每当您从基类继承时,尝试像这样更改现有接口通常是一个坏主意……它违背了所有面向对象的做法:-P

    【讨论】:

      【解决方案2】:

      您可以使用 EditorBrowsable 属性。它只会对 Intelisense 隐藏属性,但不会破坏与基类的编译时兼容性。

      虽然你知道它的名字仍然可以使用它。

      PS:请阅读本文末尾的用户cmets。 http://msdn.microsoft.com/en-us/library/system.componentmodel.editorbrowsableattribute.aspx

      【讨论】:

      • 这会在代码隐藏视图中隐藏 Intellisense 的属性吗?
      • 只要在不同程序集中定义的类,您就不会在 Intellisense 中看到该属性。但是您可以轻松地对其进行测试。
      【解决方案3】:

      如果您正在创建一个继承另一个类的类,则父方法的所有属性都应该仍然相关。在这种情况下,您可以为 get 返回日期的文本表示形式,并为 set 解析文本表示形式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多