.net 需要使用DataAnnotation继承属性
我有类似以下代码:.net 需要使用DataAnnotation继承属性,.net,vb.net,inheritance,data-annotations,.net,Vb.net,Inheritance,Data Annotations,我有类似以下代码: Imports System.ComponentModel.DataAnnotations Class Person Dim _ssn As String = "" Public Overridable Property SSN(format As Boolean) As String Get If format Then ' Return formatted SSN Else : Return
Imports System.ComponentModel.DataAnnotations
Class Person
Dim _ssn As String = ""
Public Overridable Property SSN(format As Boolean) As String
Get
If format Then
' Return formatted SSN
Else : Return _ssn
End If
End Get
Set(value As String)
_ssn = value
End Set
End Property
End Class
Class Employee
Inherits Person
<Required()>
Public Overrides Property SSN(format As Boolean) As String
Get
Return MyBase.SSN(format)
End Get
Set(value As String)
MyBase.SSN(format) = value
End Set
End Property
End Class
导入System.ComponentModel.DataAnnotations
班主任
Dim _SSNAS String=“”
公共可重写属性SSN(格式为布尔值)为字符串
收到
如果是格式,那么
'返回格式化的SSN
其他:返回\u ssn
如果结束
结束
设置(值为字符串)
_ssn=值
端集
端属性
末级
班级员工
继承人
公共重写属性SSN(格式为布尔值)为字符串
收到
返回MyBase.SSN(格式)
结束
设置(值为字符串)
MyBase.SSN(格式)=值
端集
端属性
末级
当我在Employee类上使用Validator.ValidateObject()时,即使SSN属性为Nothing,它也能很好地进行验证
知道为什么必需的属性不起作用吗
谢谢我怀疑对索引/参数化属性进行验证是行不通的,因为我不知道验证器如何为您的
格式
参数传递内容。作为一种解决方法,您可以创建一个非索引属性,将Required
属性置于其上
Class Employee
Inherits Person
<Required()>
Public Overloads Property SSN As String
Get
Return Me.SSN(False)
End Get
Set(value As String)
Me.SSN(False) = value
End Set
End Property
Public Overrides Property SSN(format As Boolean) As String
Get
Return MyBase.SSN(format)
End Get
Set(value As String)
MyBase.SSN(format) = value
End Set
End Property
End Class
Class员工
继承人
公共重载属性SSN为字符串
收到
返回我。SSN(错误)
结束
设置(值为字符串)
Me.SSN(False)=值
端集
端属性
公共重写属性SSN(格式为布尔值)为字符串
收到
返回MyBase.SSN(格式)
结束
设置(值为字符串)
MyBase.SSN(格式)=值
端集
端属性
末级
老实说,我可能会将设计更改为具有两个属性—一个读/写
SSN
属性和一个只读FormattedSSN
属性,这对我来说似乎更干净(但可能只是我!)。看起来参数化属性不会采用所需的属性。作为一种解决方法,我使用重载来解决这个问题
Imports System.ComponentModel.DataAnnotations
Class Person
Dim _ssn As String
Public Property SSN() As String
Get
Return _ssn
End Get
Set(ByVal value As String)
_ssn = JustNumbers(value)
End Set
End Property
Public Property SSN(format As String) As String
Get
Try
Return CInt(Me.SSN).ToString(format)
Catch ex As InvalidCastException : Return Me.SSN
End Try
End Get
Set(value As String)
SSN = value
End Set
End Property
Function IsValid() As Boolean
Return Validator.TryValidateObject(Me, New ValidationContext(Me), Nothing)
End Function
End Class
Class Employee
Inherits Person
<Required()>
Public Overloads Property SSN() As String
Get
Return MyBase.SSN
End Get
Set(value As String)
MyBase.SSN = value
End Set
End Property
End Class
导入System.ComponentModel.DataAnnotations
班主任
作为字符串的Dim\u ssn
公共属性SSN()作为字符串
收到
返回
结束
设置(ByVal值作为字符串)
_ssn=justNumber(值)
端集
端属性
公共属性SSN(格式为字符串)为字符串
收到
尝试
Return CInt(Me.SSN).ToString(格式)
例外情况:返回我。SSN
结束尝试
结束
设置(值为字符串)
SSN=值
端集
端属性
函数IsValid()为布尔值
返回Validator.TryValidateObject(Me,新ValidationContext(Me),Nothing)
端函数
末级
班级员工
继承人
Public将属性SSN()重载为字符串
收到
返回MyBase.SSN
结束
设置(值为字符串)
MyBase.SSN=值
端集
端属性
末级
Dim e=New Employee()
Validator.ValidateObject(e,New ValidationContext(e))
导致ValidationException:SocialSecurityNumber字段是必需的。
对于我来说,这很奇怪。我刚刚用我的例子创建了一个新项目,它也适用于我。我将进一步调查,看看在我的实际项目中是什么导致了这种情况不起作用。好的,我发现了导致所描述的行为的缺失之处。social security number属性实际上是一个参数化属性。我将在问题中更新它。伟大的人显然思想相似。我们刚刚发布了相同的解决方案。:)哈,我们也必须以同样的速度打字,才能在30秒内互相发帖!:-)