.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秒内互相发帖!:-)