SHARE
TWEET

Crear un objeto a partir de una cadena

elGuille Jan 4th, 2013 210 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. '------------------------------------------------------------------------------
  2. ' Crear un objeto a partir de una cadena con Activator              (05/Ene/13)
  3. '
  4. ' El artículo explicativo está en:
  5. ' http://www.elguillemola.com/index.php/2013/01/crear-un-objeto-a-partir-de-una-cadena-con-activator-createinstance/
  6. '
  7. ' ©Guillermo 'guille' Som, 2013
  8. '------------------------------------------------------------------------------
  9.  
  10. Namespace ActivatorVB
  11.  
  12.     Public NotInheritable Class CrearClase
  13.  
  14.         Public Shared Sub Main()
  15.  
  16.             Main2()
  17.  
  18.  
  19.             ' La clase a crear
  20.             Dim elNombre = "ActivatorVB.Colega"
  21.  
  22.             crearColega(elNombre)
  23.  
  24.             ' Esta clase se llama igual,
  25.             ' pero no es del mismo tipo
  26.             ' y no pasaría la prueba de IsAssignableFrom,
  27.             ' aunque no daría error al hacer la conversión
  28.             ' pero no crearía una instancia,
  29.             ' por tanto Activator devolvería nulo,
  30.             ' en realidad el valor nulo lo devuelve
  31.             ' la operación de conversión de tipos
  32.             ' por eso en VB utilizo TryCast en lugar
  33.             ' de DirectCast o CType
  34.             elNombre = "OtroEspacio.Colega"
  35.             crearColega(elNombre)
  36.  
  37.             ' esta clase se basa en la que queremos crear
  38.             ' aunque esté en otro espacio de nombres
  39.             elNombre = "OtroEspacio.Coleguilla"
  40.             crearColega(elNombre)
  41.  
  42.             '' Esta no tiene constructor
  43.             'elNombre = "OtroEspacio.Coleguilla2"
  44.             'crearColega(elNombre)
  45.  
  46.  
  47.             ' este tipo no existe,
  48.             ' pero debemos usar IsAssignableFrom
  49.             ' para no provocar una excepción
  50.             elNombre = "Activator.Colega"
  51.             crearColega(elNombre)
  52.  
  53.             ' esta se basa en la nuestra
  54.             ' pero es abstracta (no tiene constructor)
  55.             ' ya dará un error al crearla
  56.             ' aunque pasaría la prueba de IsAssignableFrom
  57.             Try
  58.                 elNombre = "ActivatorVB.ColegaAbstracto"
  59.                 crearColega(elNombre)
  60.  
  61.             Catch ex As Exception
  62.                 Console.WriteLine("Mrw! (o Ups!) esta clase {0} da error: {1}",
  63.                                   elNombre, ex.Message)
  64.  
  65.             End Try
  66.  
  67.  
  68.             Console.ReadKey()
  69.  
  70.         End Sub
  71.  
  72.         Private Shared Sub crearColega(laClase As String)
  73.             Dim elTipo As Type = Type.GetType(laClase)
  74.  
  75.             If Not GetType(Colega).IsAssignableFrom(elTipo) Then
  76.                 Console.WriteLine("El tipo: {0} no es del tipo adecuado." & vbLf & "",
  77.                                   laClase)
  78.                 Return
  79.  
  80.             End If
  81.  
  82.             'Dim obj1 As Object = Activator.CreateInstance(elTipo)
  83.             'Dim obj2 As Colega = CType(Activator.CreateInstance(elTipo), Colega)
  84.             'Dim obj3 As Colega = DirectCast(Activator.CreateInstance(elTipo), Colega)
  85.  
  86.             Dim obj As Colega = TryCast(Activator.CreateInstance(elTipo), Colega)
  87.  
  88.             If obj IsNot Nothing Then
  89.                 obj.Nombre = "Pepe"
  90.                 obj.Email = "pepe@outlook.com"
  91.  
  92.                 Console.WriteLine("Objeto creado correctamente: {0}{1}{2}, {3}",
  93.                                   obj.GetType().Name, vbCrLf,
  94.                                   obj.Nombre, obj.Email)
  95.             Else
  96.                 Console.WriteLine("Parece que el tipo: {0} no es del tipo adecuado.",
  97.                                   laClase)
  98.             End If
  99.  
  100.             Console.WriteLine()
  101.         End Sub
  102.  
  103.         Sub pruebaDirecta()
  104.             Dim laClase = "ActivatorVB.Colega"
  105.  
  106.             Dim elTipo As Type = Type.GetType(laClase)
  107.  
  108.             Dim obj As Colega = TryCast(Activator.CreateInstance(elTipo), Colega)
  109.  
  110.             If obj IsNot Nothing Then
  111.                 obj.Nombre = "Pepe"
  112.                 obj.Email = "pepe@outlook.com"
  113.             End If
  114.  
  115.         End Sub
  116.  
  117.         Shared Sub Main2()
  118.             Dim laClase = "ActivatorVB.unColega"
  119.  
  120.             Dim elTipo As Type = Type.GetType(laClase)
  121.  
  122.             Dim obj As IColega = TryCast(Activator.CreateInstance(elTipo), IColega)
  123.  
  124.             If obj IsNot Nothing Then
  125.                 obj.Nombre = "Pepe"
  126.             End If
  127.  
  128.         End Sub
  129.  
  130.     End Class
  131.  
  132.     Public Interface IColega
  133.         Property Nombre As String
  134.     End Interface
  135.  
  136.     Public Class unColega
  137.         Implements IColega
  138.  
  139.         Public Property Nombre As String Implements IColega.Nombre
  140.     End Class
  141.  
  142.     Public Class Colega
  143.         Public Property Nombre As String
  144.         Public Property Email As String
  145.     End Class
  146.  
  147.     ' Clase no instanciable
  148.     Public MustInherit Class ColegaAbstracto
  149.         Inherits Colega
  150.  
  151.         Public Property Edad As Integer
  152.     End Class
  153.  
  154. End Namespace
  155.  
  156. Namespace OtroEspacio
  157.  
  158.     Public Class Colega
  159.         Public Property Nombre As String
  160.         Public Property Edad As Integer
  161.     End Class
  162.  
  163.     Public Class Coleguilla
  164.         Inherits ActivatorVB.Colega
  165.  
  166.         Public Property Edad As Integer
  167.  
  168.     End Class
  169.  
  170.     ' las clase selladas (sealed / NotInheritable)
  171.     ' se pueden usar, pero siempre deben tener
  172.     ' un constructor público sin parámetros
  173.     Public NotInheritable Class Coleguilla2
  174.         Inherits ActivatorVB.Colega
  175.  
  176.         'Protected Sub New()
  177.         'End Sub
  178.  
  179.         'Private Sub New()
  180.         'End Sub
  181.  
  182.         Public Property Edad As Integer
  183.     End Class
  184.  
  185. End Namespace
RAW Paste Data
Top