反射应用之一:根据控件名、属性名进行取值和赋值
' 必须引用命名空间System.Reflection,System.ComponentModel
' 以下根据控件名和属性名取值
Public Function GetValueControlProperty( ByVal ClassInstance As Object , ByVal ControlName As String , ByVal PropertyName As String ) As Object
Dim Result As Object
Dim myType As Type = ClassInstance.GetType
Dim myFieldInfo As FieldInfo = myType.GetField( " _ " & ControlName, BindingFlags.NonPublic Or _
BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.Instance)
If Not myFieldInfo Is Nothing Then
Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(myType)
Dim myProperty As PropertyDescriptor = properties.Find(PropertyName, False )
If Not myProperty Is Nothing Then
Dim ctr As Object
ctr = myFieldInfo.GetValue(ClassInstance)
Try
Result = myProperty.GetValue(ctr)
Catch ex As Exception
MsgBox (ex.Message)
End Try
End If
End If
Return Result
End Function
' 以下根据控件名和属性名赋值
Public Function SetValueControlProperty( ByVal ClassInstance As Object , ByVal ControlName As String , ByVal PropertyName As String , ByVal Value As Object ) As Object
Dim Result As Object
Dim myType As Type = ClassInstance.GetType
Dim myFieldInfo As FieldInfo = myType.GetField( " _ " & ControlName, BindingFlags.NonPublic _
Or BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.Instance) ' 加"_"这个是特要紧的
If Not myFieldInfo Is Nothing Then
Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(myType)
Dim myProperty As PropertyDescriptor = properties.Find(PropertyName, False ) ' 这里设为True就不用区分大小写了
If Not myProperty Is Nothing Then
Dim ctr As Object
ctr = myFieldInfo.GetValue(ClassInstance) ' 取得控件实例
Try
myProperty.SetValue(ctr, Value)
Result = ctr
Catch ex As Exception
MsgBox (ex.Message)
End Try
End If
End If
Return Result
End Function
' 调用
' 以下实现Label1.Text=TextBox1.Text,Label2.Text=TextBox2
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
For i = 1 To 2
Me .SetValueControlProperty( Me , " Label " & i.ToString, " Text " , GetValueControlProperty( Me , " TextBox " & i.ToString, " Text " ))
Next i
End Sub
' 必须引用命名空间System.Reflection,System.ComponentModel
' 以下根据控件名和属性名取值
Public Function GetValueControlProperty( ByVal ClassInstance As Object , ByVal ControlName As String , ByVal PropertyName As String ) As Object
Dim Result As Object
Dim myType As Type = ClassInstance.GetType
Dim myFieldInfo As FieldInfo = myType.GetField( " _ " & ControlName, BindingFlags.NonPublic Or _
BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.Instance)
If Not myFieldInfo Is Nothing Then
Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(myType)
Dim myProperty As PropertyDescriptor = properties.Find(PropertyName, False )
If Not myProperty Is Nothing Then
Dim ctr As Object
ctr = myFieldInfo.GetValue(ClassInstance)
Try
Result = myProperty.GetValue(ctr)
Catch ex As Exception
MsgBox (ex.Message)
End Try
End If
End If
Return Result
End Function
' 以下根据控件名和属性名赋值
Public Function SetValueControlProperty( ByVal ClassInstance As Object , ByVal ControlName As String , ByVal PropertyName As String , ByVal Value As Object ) As Object
Dim Result As Object
Dim myType As Type = ClassInstance.GetType
Dim myFieldInfo As FieldInfo = myType.GetField( " _ " & ControlName, BindingFlags.NonPublic _
Or BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.Instance) ' 加"_"这个是特要紧的
If Not myFieldInfo Is Nothing Then
Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(myType)
Dim myProperty As PropertyDescriptor = properties.Find(PropertyName, False ) ' 这里设为True就不用区分大小写了
If Not myProperty Is Nothing Then
Dim ctr As Object
ctr = myFieldInfo.GetValue(ClassInstance) ' 取得控件实例
Try
myProperty.SetValue(ctr, Value)
Result = ctr
Catch ex As Exception
MsgBox (ex.Message)
End Try
End If
End If
Return Result
End Function
' 调用
' 以下实现Label1.Text=TextBox1.Text,Label2.Text=TextBox2
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
For i = 1 To 2
Me .SetValueControlProperty( Me , " Label " & i.ToString, " Text " , GetValueControlProperty( Me , " TextBox " & i.ToString, " Text " ))
Next i
End Sub