从DisplayAttribute中获取GroupName

后端开发 2026-07-07

我需要只获取分组名为 “RegexAttributes” 的属性来组成正则表达式。当前的代码之所以能工作,是因为没有其他带DisplayAttribute的属性,但如果存在来自其他分组的属性,就会失败。

Imports System.ComponentModel.DataAnnotations
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class DownloadLink
    Inherits HyperLink
    <Required(), Display(GroupName:="RegexAttributes")> Public Overloads Property NavigateUrl As String
    <Required(), Display(GroupName:="RegexAttributes")> Public Overloads Property Text As String
    <Display(GroupName:="RegexAttributes")> Public Property UpdateText As String
    <Display(GroupName:="RegexAttributes")> Public Overloads Property Target As String
    <Required()> Public Property DownloadsPath As String
    Public Shared ReadOnly Property StringPattern As String
        Get

            Dim sp As String = "\[DownloadLink\b(?:(?=(\s+("

            For Each prop In GetType(DownloadLink).GetProperties()
                For Each attribute In prop.CustomAttributes
                    If attribute.AttributeType.Name = "DisplayAttribute" Then
                        sp += $"{prop.Name}=""(?<{prop.Name}>[^""]*)""|"
                    End If
                Next
            Next
            sp = sp.Substring(0, sp.Length - 1)
            sp += ")|\s*))\1)*(\s*)/\]"

            Return sp
            'Returns "\[DownloadLink\b(?:(?=(\s+(?:NavigateUrl=""(?<NavigateUrl>[^""]*)""|Text=""(?<Text>[^""]*)""|UpdateText=""(?<UpdateText>[^""]*)""|Target=""(?<Target>[^""]*)"")|\s*))\1)*(\s*)/\]"
        End Get
    End Property

    Protected Overrides Sub Render(writer As HtmlTextWriter)
        ...
    End Sub

End Class

解决方案

与其自己逐个遍历每个属性,不如使用 GetCustomAttribute(Of T)() 扩展方法来专门查找 DisplayAttribute 并将其作为结果获取。这样就能访问到它的 GroupName 属性。

For Each prop In GetType(DownloadLink).GetProperties()
    Dim attribute As DisplayAttribute = prop.GetCustomAttribute(Of DisplayAttribute)()

    If attribute IsNot Nothing AndAlso attribute.GroupName = "RegexAttributes" Then
        sp += $"{prop.Name}=""(?<{prop.Name}>[^""]*)""|"
    End If
Next
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章