【问题标题】:Hide inherited properties on a class/interface?隐藏类/接口上的继承属性?
【发布时间】:2011-10-06 18:16:24
【问题描述】:

我想知道是否有办法在 C# 中隐藏子类型的继承属性,例如:

public interface ISupplierLogin : ISupplier
{
    [Obsolete]
    new string BusinessName { get; set; }

    [Obsolete]
    new long ABN { get; set; }

    [Obsolete]
    new DateTime DateRegistered { get; set; }
}

public interface ISupplier
{
    bool TradeOnly { get; set; }

    [Required]
    [DisplayName("Business Name")]
    [StringLength(25, ErrorMessage = "The maximum length of business name is 25 characters.")]
    [DataType(DataType.Text)]
    string BusinessName { get; set; }

    [Required]
    [DisplayName("Australian Business Number")]
    [ABNValidator(ErrorMessage="The ABN you entered does not appear to be valid.")]
    long ABN { get; set; }

    [Required]
    [RegularExpression("^[a-zA-Z0-9]+$", ErrorMessage="The username you entered does not appear to be valid. (a-z & 0-9)")]
    [StringLength(25, ErrorMessage = "The maximum length of username is 25 characters")]
    [DataType(DataType.Text)]
    string Username { get; set; }

    [Required]
    [StringLength(12, ErrorMessage = "The maximum length of password must be between 8 and 12 characters long.")]
    [DataType(DataType.Password)]
    string Password { get; set; }

    [DisplayName("Date Registered")]
    DateTime DateRegistered { get; set; }
}

我想在我的视图模型中继承我的验证属性,但仅限于两个属性。

有没有办法巧妙地实现我想要做的事情?

谢谢。

【问题讨论】:

  • 你可以将基本成员设为虚拟,然后用[EditorBrowsable(EditorBrowsableState.Never)]覆盖它

标签: c# .net inheritance .net-4.0 interface


【解决方案1】:

您误解了继承的概念:基本上,当您有两个类AB,而BA 的扩展时,B继承所有A 的非私有元素;如果您使用一个接口和一个类、两个接口等,这没有什么不同。

因此,在我看来,如果您实现 所有字段,您应该仅使用继承,否则您有点违背继承的目的,并且您没有遵循面向对象原则。

可以做的然而(不是最好的选择,但它是可能的)是使用:

thow new NotImplementedException();

这向最终程序员表明他/她不能使用此属性,因为他或她的应用程序将在调试阶段抛出异常。

同样可以使用[Obsolete(..., true)],这会使编译器在编译时抛出错误; 注意第二个参数设置为true另外,您可以使用[Browsable(false)] 将其隐藏在 IntelliSense 中,但这仍然允许使用此属性。


您可以将此添加到属性中,这将有效地禁用您的属性的大多数用途。它实际上不会以您想要的方式隐藏它,但它确实显示开发人员忽略它。

[Bindable(false)]
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

就实际隐藏它而言,我认为这是不可能的。

【讨论】:

  • 是的,这是继承的概念,但是我试图隐藏反射的属性,以避免模型绑定时出错。所以我真的在问如何在这种情况下实现“类似”的继承,但是我隐藏属性而不是添加它们。
  • 这就是继承的全部问题,没有“隐藏”属性,只有扩展,但让我用我不久前在互联网上找到的东西来编辑答案。
【解决方案2】:

【讨论】:

    最近更新 更多