从DisplayAttribute中获取GroupName
我需要只获取分组名为 “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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。