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

发表于:2007-06-30来源:作者:点击数: 标签:
@#必须引用命名空间System.Reflection,System.ComponentModel @#以下根据控件名和属性名取值 Public Function GetValueControlProperty(ByVal ClassInstance As Object, ByVal ControlName As String, ByVal PropertyName As String) As Object Dim Result A
@#必须引用命名空间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

原文转自:http://www.ltesting.net