我想知道是否有办法在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; }
}
我想在视图模型中继承我的验证属性,但仅限于两个属性。
无论如何要实现我想要整齐地做的事情吗?
感谢。
答案 0 :(得分:4)
你误解了继承的想法:基本上当你有两个类A
和B
时,B
是A
的一个范围,B
将继承 A
的所有非私有元素;如果你使用的是interace和一个类,两个接口等,那就没有什么不同了。
因此,在我看来,如果你实现所有字段,你应该只使用继承,否则你会破坏继承的目的而你不会遵循面向对象原理
你可以做什么但是(不是最好的选择,但有可能)是使用:
thow new NotImplementedException();
这向最终程序员展示他/她不能使用此属性,因为他或她的应用程序将在调试阶段抛出异常。
类似地,您可以使用[Obsolete(..., true)]
,这将使编译器在编译时抛出错误; note 第二个参数设置为true
。 同样,您可以使用[Browsable(false)]
在IntelliSense中隐藏它,但这仍然允许使用此属性。
您可以将此添加到属性,这将有效地禁用您的属性的大多数用法。 不实际上会隐藏它你想要的意义,但它确实显示开发人员忽略它。
[Bindable(false)]
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
实际隐藏它的时候,我认为没有可能。
答案 1 :(得分:1)