Tengo un VB.NET clase llamada billete que tiene varias propiedades públicas de tipo ‘campo’. Me gustaría tener una manera de que yo pueda iterar a través de todas estas propiedades (una para cada uno) y realizar una tarea específica en cada uno de ellos. Pensé que tal vez la mejor manera era crear una lista(De campo) y llenar la lista con el «campo» de las propiedades de esa clase. Lo que no sé cómo hacer es obtener las propiedades en la lista de forma dinámica, de modo que si puedo agregar propiedades en el futuro no tener que escribirlos en la lista manualmente. Alguna idea sobre cómo podría hacer esto? He intentado buscar y encontrar algunos ejemplos de uso de la reflexión, pero yo sólo podía averiguar cómo llegar a el nombre de la propiedad y no la propiedad en sí.

Aquí es un ejemplo de una clase:

Public Class ticket
    Public Property location As New field
    Public Property user As New field
    Public Property callType As New field
    Public Property dateOfCall As New field
    Public Property tech As New field
    Public Property description As New field

    Public Property myFields As New List(Of field)

'What if field had a property of value and I wanted to increment all of the fields    in this class by one

Public Sub plusOne()
    For Each x As field In myFields()
        x.value += 1
    Next
End Sub

End Class
InformationsquelleAutor donL | 2012-11-09

3 Comentarios

  1. 3

    Desea utilizar La reflexión, que simplemente significa la inspección de los tipos en una asamblea. Usted puede hacer esto a través de la Sistema.La reflexión espacio de nombres.

    Consulte el siguiente artículo de msdn magazine para ejemplos de reflexión en VB.Net:
    http://msdn.microsoft.com/en-us/magazine/cc163750.aspx

    Un ejemplo de la iteración sobre los miembros de un tipo en el que el artículo es como sigue:

    Dim t As Type = GetType(AcmeCorp.BusinessLogic.Customer)
    For Each member As MemberInfo In t.GetMembers
      Console.WriteLine(member.Name)
    Next
    • ¿Cómo puedo lograr algo de nombres.agregar(miembro)? O me estoy acercando el camino equivocado?
  2. 0

    De nuevo como la respuesta anterior, utilice la reflexión. Para llamar como un ejemplo Add en un List(Of T) yo iba a hacer esto.

    Public Class Test
      Public Property SomeList As List(Of String)
    End Class

    A continuación, utilice el siguiente código para llamar a agregar en un List(Of String)

    Dim pi As PropertyInfo = GetType(Test).GetProperty("SomeList")
    Dim mi As MethodInfo = GetType(List(Of String)).GetMethod("Add")
    Dim t As New Test()
    t.SomeList = New List(Of String)
    mi.Invoke(pi.GetValue(t, Nothing), New Object() {"Added through reflection"})
  3. 0

    Como las respuestas anteriores han dicho, usted necesita el uso del Sistema.La reflexión para obtener las propiedades de la clase. A continuación, compruebe la propiedad es el tipo que desee.

    Esto debería darle lo que quiere. Si ejecuta el código verás que sólo toma las propiedades del tipo especificado. Si quieres tener todas las propiedades, eliminar la instrucción where en el bucle for each.

    Imports System.Reflection
    
    Module Module1
    
    Sub Main()
    
        ' Create a list to hold your properties
        Dim myList As New List(Of MyProperty)
    
        ' check each property for its type using the where statement below. Change integer to "Field" in your case
        For Each el In GetType(Test).GetProperties.Where(Function(p) p.PropertyType = GetType(Integer))
            ' add each matching property to the list
            myList.Add(New MyProperty With {.Name = el.Name, .GetMethod = el.GetGetMethod(), .SetMethod = el.GetSetMethod()})
            Console.WriteLine(el.Name & " has been added to myList")
        Next
    
        Console.Read()
    End Sub
    
    Public Class MyProperty
        Public Property Name As String
        Public Property GetMethod As MethodInfo
        Public Property SetMethod As MethodInfo
    End Class
    
    Public Class Test
        Private var1 As String
        Private var2 As String
        Private var3 As String
        Private var4 As String
    
        Public Property myInt1 As Integer
        Public Property myInt2 As Integer
        Public Property myInt3 As Integer
        Public Property myInt4 As Integer
    End Class
    End Module

    Espero que ayude

    • Corrígeme si me equivoco, pero esto crea una lista de objetos que son duplicados no es el mismo. Así que si hice una para cada modificar cada una de las Pruebas en la lista no estaría modificando las propiedades de la instancia de esa clase.
    • Completamente fuera de la parte superior de mi cabeza, pero debería funcionar porque la clase se aferra a la de referencia. Es algo que puedes probar descargando el código anterior en una aplicación de consola. Yo no puedo hacerlo atm, aunque de otra forma de identificación para verificar que

Dejar respuesta

Please enter your comment!
Please enter your name here