反射应用之一:根据控件名、属性名进行取值和赋值

来源:互联网 发布:2015淘宝新店扶持时间 编辑:程序博客网 时间:2024/05/17 09:38
'必须引用命名空间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

原创粉丝点击