個人檔案Gustavo Bonansea部落格清單 工具 說明
14 December

Obtener los parámetros y valor de retorno de propiedades y métodos

Este es un pequeño ejemplo de cómo utilizar Reflection para obtener información como miembros, parámetros y tipos de datos devueltos. Hoy lo envié como respuesta a una consulta en el MUG y quiero postearlo aquí así queda público en la blogósfera.

 

 

 

Código

 

 

Imports System.Reflection

Public Class Form1
   Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

   Public Sub New()
      MyBase.New()

      'This call is required by the Windows Form Designer.
      InitializeComponent()

      'Add any initialization after the InitializeComponent() call

   End Sub

   'Form overrides dispose to clean up the component list.
   Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
      If disposing Then
         If Not (components Is Nothing) Then
            components.Dispose()
         End If
      End If
      MyBase.Dispose(disposing)
   End Sub

   'Required by the Windows Form Designer
   Private components As System.ComponentModel.IContainer

   'NOTE: The following procedure is required by the Windows Form Designer
   'It can be modified using the Windows Form Designer. 
   'Do not modify it using the code editor.
   Friend WithEvents btnGet As System.Windows.Forms.Button
   Friend WithEvents Label1 As System.Windows.Forms.Label
   Friend WithEvents txtType As System.Windows.Forms.TextBox
   Friend WithEvents Label2 As System.Windows.Forms.Label
   Friend WithEvents Label3 As System.Windows.Forms.Label
   Friend WithEvents lstParams As System.Windows.Forms.ListBox
   Friend WithEvents lstMembers As System.Windows.Forms.ListBox
   Friend WithEvents txtReturn As System.Windows.Forms.TextBox
   Friend WithEvents Label4 As System.Windows.Forms.Label
   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
      Me.btnGet = New System.Windows.Forms.Button
      Me.Label1 = New System.Windows.Forms.Label
      Me.txtType = New System.Windows.Forms.TextBox
      Me.lstMembers = New System.Windows.Forms.ListBox
      Me.Label2 = New System.Windows.Forms.Label
      Me.Label3 = New System.Windows.Forms.Label
      Me.lstParams = New System.Windows.Forms.ListBox
      Me.txtReturn = New System.Windows.Forms.TextBox
      Me.Label4 = New System.Windows.Forms.Label
      Me.SuspendLayout()
      '
      'btnGet
      '
      Me.btnGet.Location = New System.Drawing.Point(288, 40)
      Me.btnGet.Name = "btnGet"
      Me.btnGet.TabIndex = 0
      Me.btnGet.Text = "Get"
      '
      'Label1
      '
      Me.Label1.Location = New System.Drawing.Point(16, 16)
      Me.Label1.Name = "Label1"
      Me.Label1.Size = New System.Drawing.Size(40, 23)
      Me.Label1.TabIndex = 1
      Me.Label1.Text = "Type"
      '
      'txtType
      '
      Me.txtType.Location = New System.Drawing.Point(56, 16)
      Me.txtType.Name = "txtType"
      Me.txtType.Size = New System.Drawing.Size(304, 20)
      Me.txtType.TabIndex = 2
      Me.txtType.Text = ""
      '
      'lstMembers
      '
      Me.lstMembers.Location = New System.Drawing.Point(16, 72)
      Me.lstMembers.Name = "lstMembers"
      Me.lstMembers.Size = New System.Drawing.Size(344, 95)
      Me.lstMembers.TabIndex = 3
      '
      'Label2
      '
      Me.Label2.Location = New System.Drawing.Point(16, 48)
      Me.Label2.Name = "Label2"
      Me.Label2.Size = New System.Drawing.Size(56, 23)
      Me.Label2.TabIndex = 4
      Me.Label2.Text = "Members"
      '
      'Label3
      '
      Me.Label3.Location = New System.Drawing.Point(16, 176)
      Me.Label3.Name = "Label3"
      Me.Label3.Size = New System.Drawing.Size(48, 23)
      Me.Label3.TabIndex = 6
      Me.Label3.Text = "Params"
      '
      'lstParams
      '
      Me.lstParams.Location = New System.Drawing.Point(16, 200)
      Me.lstParams.Name = "lstParams"
      Me.lstParams.Size = New System.Drawing.Size(344, 95)
      Me.lstParams.TabIndex = 5
      '
      'txtReturn
      '
      Me.txtReturn.Location = New System.Drawing.Point(56, 304)
      Me.txtReturn.Name = "txtReturn"
      Me.txtReturn.Size = New System.Drawing.Size(304, 20)
      Me.txtReturn.TabIndex = 8
      Me.txtReturn.Text = ""
      '
      'Label4
      '
      Me.Label4.Location = New System.Drawing.Point(16, 304)
      Me.Label4.Name = "Label4"
      Me.Label4.Size = New System.Drawing.Size(40, 23)
      Me.Label4.TabIndex = 7
      Me.Label4.Text = "Return"
      '
      'Form1
      '
      Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
      Me.ClientSize = New System.Drawing.Size(392, 353)
      Me.Controls.Add(Me.txtReturn)
      Me.Controls.Add(Me.Label4)
      Me.Controls.Add(Me.Label3)
      Me.Controls.Add(Me.lstParams)
      Me.Controls.Add(Me.Label2)
      Me.Controls.Add(Me.lstMembers)
      Me.Controls.Add(Me.txtType)
      Me.Controls.Add(Me.Label1)
      Me.Controls.Add(Me.btnGet)
      Me.Name = "Form1"
      Me.Text = "Get Params"
      Me.ResumeLayout(False)

   End Sub

#End Region

   Private Sub btnGet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGet.Click
      Dim targetType As Type

      lstMembers.Items.Clear()

      'Creamos una variable para reflejar el tipo que eligio explorar el usuario
      targetType = Type.GetType(txtType.Text)

      If targetType Is Nothing Then
         MessageBox.Show("El tipo no es correcto")
      Else
         'Recorremos los miembros y los agregamos a la lista
         For Each targetMember As MemberInfo In targetType.GetMembers()
            lstMembers.Items.Add(targetMember)
         Next
      End If
   End Sub

   Private Sub lstMembers_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstMembers.SelectedIndexChanged
      Dim targetMember As MemberInfo
      Dim targetMethod As MethodInfo
      Dim targetProperty As PropertyInfo
      Dim targetConstructor As ConstructorInfo


      txtReturn.Text = ""
      lstParams.Items.Clear()
      targetMember = lstMembers.SelectedItem

      'Seleccionamos los parametros dependiendo el tipo de miembro seleccionado
      Select Case targetMember.MemberType
         Case MemberTypes.Method
            targetMethod = targetMember

            'Obtenemos los parametros
            For Each targetParam As ParameterInfo In targetMethod.GetParameters
               lstParams.Items.Add(ParamToString(targetParam))
            Next
            txtReturn.Text = targetMethod.ReturnType.ToString

         Case MemberTypes.Constructor
            targetConstructor = targetMember

            'Obtenemos los parametros
            For Each targetParam As ParameterInfo In targetConstructor.GetParameters
               lstParams.Items.Add(ParamToString(targetParam))
            Next
            txtReturn.Text = ""

         Case MemberTypes.Property
            targetProperty = targetMember

            'Obtenemos los parametros
            For Each targetParam As ParameterInfo In targetProperty.GetIndexParameters
               lstParams.Items.Add(ParamToString(targetParam))
            Next
            txtReturn.Text = targetProperty.PropertyType.ToString

      End Select

   End Sub

   'Devuelve una cadena con informacion del parametro
   Private Function ParamToString(ByVal value As ParameterInfo) As String
      Return value.Name & " - " & value.ParameterType.ToString
   End Function

End Class

GB

回應

請稍候...
很抱歉,您輸入的回應過長。請縮短您的回應。
您尚未輸入內容,請再試一次。
很抱歉,目前無法新增您的回應,請稍後再試。
若要新增回應,您的父母必須先給您權限。要求權限
您的家長已關閉回應功能。
很抱歉,目前無法刪除您的回應,請稍後再試。
您已超過每日回應上限次數,請於 24 小時後再試一次。
由於系統顯示您可能傳送垃圾郵件給其他使用者,因此您帳號中的回應功能已遭停用。 如果您認為自己帳號遭錯誤停用,請連絡 Windows Live 支援
請完成下列安全檢查,以完成回應。
您輸入的安全檢查字元必須與圖片或音訊中的字元相符。

若要新增回應,請以您的 Windows Live ID 登入 (若您使用 Hotmail、Messenger 或 Xbox LIVE,則您已擁有 Windows Live ID)。登入


沒有 Windows Live ID?註冊

引用通告

此內容的引用通告是:
http://misopiniones.spaces.live.com/blog/cns!2737DC89A4AAB26B!530.trak
引述這則內容的部落格