使用 GetValue 和 System.Reflection
Using GetValue and System.Reflection
使用VB.Net。我正在尝试从具有相同 class 的两个对象中获取 属性 值并进行比较。如果值不同,那么我想将它们添加到一个字符串中,显示值是什么以及它们更改为什么。我在使用 GetValue 时遇到问题。
这是此函数的代码:
Public Function GetRowChangesList(ByVal Before As IEnumerable(Of Object), ByVal After As IEnumerable(Of Object), ByRef isNew As Boolean) As String
Dim TheseChanges As List(Of String) = Nothing
'any errors, return ""
Try
'If Lists are both empty, return
If Before Is Nothing And After Is Nothing Then
Return ""
End If
'Figure out the object type and make sure before and after match
Dim DataTypeBefore As Type
Dim DataTypeAfter As Type
DataTypeBefore = Before.Single.GetType()
DataTypeAfter = After.Single.GetType()
'if they don't match function won't work
If DataTypeBefore IsNot DataTypeAfter Then
Return ""
End If
Dim myField As PropertyInfo() = Before.Single.GetType().GetProperties()
Dim myField2 As PropertyInfo() = After.Single.GetType().GetProperties()
'Find the changes
Dim index As Integer
For index = 0 To myField2.Length - 1
If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then
TheseChanges(0) += ("Change happened at: " + myField(index).Name.ToString + " Values changed from: " +
myField(index).GetValue(Before).ToString + " To " + myField2(index).GetValue(After).ToString)
End If
Next
Catch ex As Exception
'send error
SendErrorEmail(ex, "Saving changes for: '" + Before.Single.GetType().ToString)
End Try
'return
Return TheseChanges(0)
End Function
如果有任何变化,应该只有一件事发生了变化。这就是为什么它只是 returns 第一个元素。当我调试时,它每次都会捕获异常。它给我的错误如下:
If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then error BC30199: '(' expected.
TheseChanges(0) = ("Change happened at: " + myField(index).Name.ToString + " Values changed from: " + error BC30201: Expression expected.
myField(index).GetValue(Before).ToString + " To " + myField2(index).GetValue(After).ToString) error BC37237: ')' is not a valid format specifier
End If error BC30201: Expression expected.
Next error BC30201: Expression expected.
编辑:
我刚刚尝试了这种方法,但仍然遇到相同的错误(下面的代码)。也只是尝试将 '=' 更改为 isNot (没有改变任何东西),我也只是尝试在每个值周围添加括号,但也没有改变任何东西。
If myField(index).GetValue(myField(index).Name) = myField2(index).GetValue(myField(index).Name)
变化:
If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then
收件人:
If Not myField(index).GetValue(Before.Single) = myField2(index).GetValue(After.Single) Then
解释:
myField
是为类型 Before.Single
创建的,但您将其与 Before
一起使用,这与 Before.Single
.
类型不同
使用VB.Net。我正在尝试从具有相同 class 的两个对象中获取 属性 值并进行比较。如果值不同,那么我想将它们添加到一个字符串中,显示值是什么以及它们更改为什么。我在使用 GetValue 时遇到问题。 这是此函数的代码:
Public Function GetRowChangesList(ByVal Before As IEnumerable(Of Object), ByVal After As IEnumerable(Of Object), ByRef isNew As Boolean) As String
Dim TheseChanges As List(Of String) = Nothing
'any errors, return ""
Try
'If Lists are both empty, return
If Before Is Nothing And After Is Nothing Then
Return ""
End If
'Figure out the object type and make sure before and after match
Dim DataTypeBefore As Type
Dim DataTypeAfter As Type
DataTypeBefore = Before.Single.GetType()
DataTypeAfter = After.Single.GetType()
'if they don't match function won't work
If DataTypeBefore IsNot DataTypeAfter Then
Return ""
End If
Dim myField As PropertyInfo() = Before.Single.GetType().GetProperties()
Dim myField2 As PropertyInfo() = After.Single.GetType().GetProperties()
'Find the changes
Dim index As Integer
For index = 0 To myField2.Length - 1
If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then
TheseChanges(0) += ("Change happened at: " + myField(index).Name.ToString + " Values changed from: " +
myField(index).GetValue(Before).ToString + " To " + myField2(index).GetValue(After).ToString)
End If
Next
Catch ex As Exception
'send error
SendErrorEmail(ex, "Saving changes for: '" + Before.Single.GetType().ToString)
End Try
'return
Return TheseChanges(0)
End Function
如果有任何变化,应该只有一件事发生了变化。这就是为什么它只是 returns 第一个元素。当我调试时,它每次都会捕获异常。它给我的错误如下:
If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then error BC30199: '(' expected.
TheseChanges(0) = ("Change happened at: " + myField(index).Name.ToString + " Values changed from: " + error BC30201: Expression expected.
myField(index).GetValue(Before).ToString + " To " + myField2(index).GetValue(After).ToString) error BC37237: ')' is not a valid format specifier
End If error BC30201: Expression expected.
Next error BC30201: Expression expected.
编辑: 我刚刚尝试了这种方法,但仍然遇到相同的错误(下面的代码)。也只是尝试将 '=' 更改为 isNot (没有改变任何东西),我也只是尝试在每个值周围添加括号,但也没有改变任何东西。
If myField(index).GetValue(myField(index).Name) = myField2(index).GetValue(myField(index).Name)
变化:
If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then
收件人:
If Not myField(index).GetValue(Before.Single) = myField2(index).GetValue(After.Single) Then
解释:
myField
是为类型 Before.Single
创建的,但您将其与 Before
一起使用,这与 Before.Single
.