Código de cómo instanciar una clase a partir del contenido de una cadena (Visual Basic)

 

Lo dicho el código completo para Visual Basic del ejemplo comentado en:

Crear un objeto a partir de una cadena con Activator.CreateInstance

 

(el enlace al de C# está en ese mismo artículo)

 

Namespace ActivatorVB

    Public NotInheritable Class CrearClase

        Public Shared Sub Main()

            'CrearClase2.Prueba()

            'Main2()

            Prueba()

            Console.ReadKey()

        End Sub

        Private Shared Sub Prueba()
            ' La clase a crear
            Dim elNombre = "ActivatorVB.Colega"

            crearColega(elNombre)

            ' Esta clase se llama igual,
            ' pero no es del mismo tipo
            ' y no pasaría la prueba de IsAssignableFrom,
            ' aunque no daría error al hacer la conversión
            ' pero no crearía una instancia,
            ' por tanto Activator devolvería nulo,
            ' en realidad el valor nulo lo devuelve
            ' la operación de conversión de tipos
            ' por eso en VB utilizo TryCast en lugar
            ' de DirectCast o CType
            elNombre = "OtroEspacio.Colega"
            crearColega(elNombre)

            ' esta clase se basa en la que queremos crear
            ' aunque esté en otro espacio de nombres
            elNombre = "OtroEspacio.Coleguilla"
            crearColega(elNombre)

            '' Esta no tiene constructor
            'elNombre = "OtroEspacio.Coleguilla2"
            'crearColega(elNombre)


            ' este tipo no existe,
            ' pero debemos usar IsAssignableFrom
            ' para no provocar una excepción
            elNombre = "Activator.Colega"
            crearColega(elNombre)

            ' esta se basa en la nuestra
            ' pero es abstracta (no tiene constructor)
            ' ya dará un error al crearla
            ' aunque pasaría la prueba de IsAssignableFrom
            Try
                elNombre = "ActivatorVB.ColegaAbstracto"
                crearColega(elNombre)

            Catch ex As Exception
                Console.WriteLine("Mrw! (o Ups!) esta clase {0} da error: {1}",
                                  elNombre, ex.Message)

            End Try

        End Sub

        Private Shared Sub crearColega(laClase As String)
            Dim elTipo As Type = Type.GetType(laClase)

            If Not GetType(Colega).IsAssignableFrom(elTipo) Then
                Console.WriteLine("El tipo: {0} no es del tipo adecuado." & vbLf & "",
                                  laClase)
                Return

            End If

            'Dim obj1 As Object = Activator.CreateInstance(elTipo)
            'Dim obj2 As Colega = CType(Activator.CreateInstance(elTipo), Colega)
            'Dim obj3 As Colega = DirectCast(Activator.CreateInstance(elTipo), Colega)

            Dim obj As Colega = TryCast(Activator.CreateInstance(elTipo), Colega)

            If obj IsNot Nothing Then
                obj.Nombre = "Pepe"
                obj.Email = "pepe@outlook.com"

                Console.WriteLine("Objeto creado correctamente: {0}{1}{2}, {3}",
                                  obj.GetType().Name, vbCrLf,
                                  obj.Nombre, obj.Email)
            Else
                Console.WriteLine("Parece que el tipo: {0} no es del tipo adecuado.",
                                  laClase)
            End If

            Console.WriteLine()
        End Sub

        Sub pruebaDirecta()
            Dim laClase = "ActivatorVB.Colega"

            Dim elTipo As Type = Type.GetType(laClase)

            Dim obj As Colega = TryCast(Activator.CreateInstance(elTipo), Colega)

            If obj IsNot Nothing Then
                obj.Nombre = "Pepe"
                obj.Email = "pepe@outlook.com"
            End If

        End Sub

        Shared Sub Main2()
            Dim laClase = "ActivatorVB.unColega"

            Dim elTipo As Type = Type.GetType(laClase)

            Dim obj As IColega = TryCast(Activator.CreateInstance(elTipo), IColega)

            If obj IsNot Nothing Then
                obj.Nombre = "Pepe"
            End If

        End Sub

    End Class

    Public Interface IColega
        Property Nombre As String
    End Interface

    Public Class unColega
        Implements IColega

        Public Property Nombre As String Implements IColega.Nombre
    End Class

    Public Class Colega
        Public Property Nombre As String
        Public Property Email As String
    End Class

    ' Clase no instanciable
    Public MustInherit Class ColegaAbstracto
        Inherits Colega

        Public Property Edad As Integer
    End Class

End Namespace

Namespace OtroEspacio

    Public Class Colega
        Public Property Nombre As String
        Public Property Edad As Integer
    End Class

    Public Class Coleguilla
        Inherits ActivatorVB.Colega

        Public Property Edad As Integer

    End Class

    ' las clase selladas (sealed / NotInheritable)
    ' se pueden usar, pero siempre deben tener 
    ' un constructor público sin parámetros
    Public NotInheritable Class Coleguilla2
        Inherits ActivatorVB.Colega

        'Protected Sub New()
        'End Sub

        'Private Sub New()
        'End Sub

        Public Property Edad As Integer
    End Class

End Namespace


 

Nos vemos.

Guillermo

P.S. (06/Ene/13)

He actualizado el código que esta entrada la edité desde el editor de WordPress y se hizo un follón, quitando los espacios y el formato… GRRRR!

Esta entrada fue publicada en cosas técnicas, mis cosas y etiquetada , , . Guarda el enlace permanente.