我正在努力从方法中检索自定义属性。如您所见,ProcessXML方法具有自定义属性。方法本身被传递到一个匿名委托,然后,在那个上下文中,我想要获得它的自定义属性,但我不知道如何做到这一点。
如果有人能告诉我正确的方法,我真的很感激。非常感谢
这是我的代码
Public Sub UpdateXML()
Dim errors = New Errors
Dim xml = <testxml>
<element value="1"/>
<element value="2"/>
<element value="3"/>
</testxml>
Dim funcWithErrorTrapping = ProcessXML().WithErrorTrapping(errors)
Dim res = funcWithErrorTrapping(xml)
If errors.Count = 0 Then
MessageBox.Show("Success - " & res)
Else
MessageBox.Show("Failure - " & errors.Count)
End If
End Sub
<ThrowException(123456, "He's a very naughty boy")>
Private Overloads Function ProcessXML() As Func(Of XElement, String)
Return Function(x)
For Each e In x.Descendants("element")
e.Attribute("value").Value = "set"
Next
Throw New Exception
Return x.ToString
End Function
End Function
End Class
Public Class Errors
Inherits Dictionary(Of Integer, String)
End Class
<AttributeUsage(AttributeTargets.All, inherited:=False, AllowMultiple:=False)>
Public NotInheritable Class ThrowException
Inherits Attribute
Private _number As Integer
Private _description As String
Public Sub New(ByVal number As Integer, ByVal description As String)
_number = number
_description = description
End Sub
Public ReadOnly Property Number As Integer
Get
Return _number
End Get
End Property
Public ReadOnly Property Description As String
Get
Return _description
End Get
End Property
End Class
Public Module Extensions
<Extension()>
Public Function WithErrorTrapping(Of T, T1)(ByVal process As Func(Of T, T1), ByVal errors As Errors) As Func(Of T, T1)
Return Function(a)
Try
Return process.Invoke(a)
Catch ex As Exception
Dim [exception] = process.Method.GetAttributes(Of ThrowException)()(1)
errors.Add([exception].Number, [exception].Description)
End Try
End Function
End Function
<Extension()>
Public Function GetAttributes(Of T As Attribute)(ByVal attributesProvider As ICustomAttributeProvider)
Dim attributes = New List(Of T)
For Each attr As Object In attributesProvider.GetCustomAttributes(GetType(T), False)
If TypeOf attr Is T Then
attributes.Add(TryCast(attr, T))
End If
Next
Return attributes
End Function
End Module
答案 0 :(得分:1)
所以我意识到AOP(Postsharp)是一个更好的方法来实现我在这里尝试做的事情!