如何隐藏 ASP.NET 自定义控件的继承属性?

How can I hide inherited properties of an ASP.NET custom control?

这是我第一次创建自定义控件的经历。我的真实示例要大得多,但为了清楚起见,将其简化。最终,我需要尽可能多地隐藏自定义控件的属性,这样当我与团队的其他成员共享我的新控件时,他们只需担心需要的几个属性。

我有一个名为 TimeNow 的控件,它继承了 System.Web.UI.WebControls.Literal,基本上只是在网页上打印当前时间:

public class TimeNow : Literal

// Set to private so Text is hidden from the editor.
private string Text
{
    get;
    set;
}

protected override void Render(HtmlTextWriter writer)
{
    // Get and write the time of now.
}

这个有效,但看起来很笨重。当我将控件放在网页上时,我不再在智能感知中看到可用的文本,但我确实收到一条警告,提示我的文本隐藏了继承的文本。有没有更好的方法来隐藏文本 属性?

试试这个:

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
private string Text
{

}

该警告消息应该有更多信息,建议您使用 new 关键字,如果您 确实 打算隐藏继承的成员,请按其说明操作:

public class TimeNow : Literal
{
    new private string Text
    {
        get;
        set;
    }
}

如果你从一个行为类似于 ITextControlLiteral 派生(Literal 已经实现了这个接口)然后你尝试删除基本的文本 属性?这就像派生自 cat 但不想让它们做 "meow" 并迫使它们像鸭子一样飞翔。我认为您正在搜索动物 class。

我不太了解 ASP.NET(仅适用于桌面的 .Net)。也许可以使用组合而不是继承(如果你真的不需要文字 -> "Cat"),你可以从 System.Web.UI.Control (-> "Animal")继承。

public class TimeNow : System.Web.UI.Control
{
   // no need to do something here with the Text property, is not defined
}

或组合

public class TimeNow : System.Web.UI.Control
{
     private readonly Literal literal;

     public TimeNow()
     {
         this.literal = new Literal();
         // ... and set the Text etc., no one else can access
     }

     // or something like this

     public TimeNow(ILiteralFactory literalFactory)
     {
         // the factory is just an example... don't know your context but this way your newly created literal can't be accessed
         this.literal = literalFactory.CreateNewLiteral();
         // do what you want with the text control, e.g. store internally
         // Clone() the Literal etc.
         // the
     }
}

更新: 快速浏览了 MSDN,也许 Content Control 是您要找的东西,而不是文字。 (抱歉,写错了桌面应用)