Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //-----------------------------------------------------------------------------
- // Crear un objeto a partir de una cadena con Activator (05/Ene/13)
- //
- // El artículo explicativo está en:
- // http://www.elguillemola.com/index.php/2013/01/crear-un-objeto-a-partir-de-una-cadena-con-activator-createinstance/
- //
- // ©Guillermo 'guille' Som, 2013
- //-----------------------------------------------------------------------------
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace ActivatorCS
- {
- public sealed class CrearClase
- {
- public static void Main()
- {
- // La clase a crear
- var elNombre = "ActivatorCS.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 C# utilizo "as Colega" en lugar de "(Colega)"
- // para hacer la conversión
- 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);
- // 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 = "ActivatorCS.ColegaAbstracto";
- crearColega(elNombre);
- }
- catch (Exception ex)
- {
- Console.WriteLine("Mrw! (o Ups!) esta clase {0} da error: {1}",
- elNombre, ex.Message);
- }
- Console.ReadKey();
- }
- private static void crearColega(string laClase)
- {
- Type elTipo = Type.GetType(laClase);
- // el equivalente en c# de TryCast es hacer el cast con "as tipo"
- // aunque también se puede comprobar si se puede crear el objeto
- // Esto contralará las clases que no se basan en Colega
- if (!typeof(Colega).IsAssignableFrom(elTipo))
- {
- Console.WriteLine("El tipo: {0} no es del tipo adecuado.\n",
- laClase);
- return;
- }
- Colega obj = Activator.CreateInstance(elTipo) as Colega;
- if (obj != null)
- {
- obj.Nombre = "Pepe";
- obj.Email = "pepe@outlook.com";
- Console.WriteLine("Objeto creado correctamente: {0}{1}{2}, {3}",
- obj.GetType().Name, "\r\n",
- obj.Nombre, obj.Email);
- }
- else
- {
- Console.WriteLine("Parece que el tipo: {0} no es del tipo adecuado.",
- laClase);
- }
- Console.WriteLine();
- }
- void pruebaDirecta()
- {
- var laClase = "ActivatorCS.Colega";
- Type elTipo = Type.GetType(laClase);
- Colega obj = Activator.CreateInstance(elTipo) as Colega;
- if (obj != null)
- {
- obj.Nombre = "Pepe";
- obj.Email = "pepe@outlook.com";
- }
- }
- static void Main2()
- {
- var laClase = "ActivatorVB.unColega";
- Type elTipo = Type.GetType(laClase);
- IColega obj = ((IColega)Activator.CreateInstance(elTipo));
- if (obj != null)
- {
- obj.Nombre = "Pepe";
- }
- }
- }
- public interface IColega
- {
- string Nombre { get; set; }
- }
- public class unColega : IColega
- {
- public string Nombre { get; set; }
- }
- public class Colega
- {
- public string Nombre { get; set; }
- public string Email { get; set; }
- }
- // Clase no instanciable
- public abstract class ColegaAbstracto : Colega
- {
- public int Edad { get; set; }
- }
- }
- namespace OtroEspacio
- {
- public class Colega
- {
- public string Nombre { get; set; }
- public int Edad { get; set; }
- }
- public class Coleguilla : ActivatorCS.Colega
- {
- public int Edad { get; set; }
- }
- // las clase selladas (sealed / NotInheritable)
- // se pueden usar, pero siempre deben tener
- // un constructor público sin parámetros
- public sealed class Coleguilla2 : ActivatorCS.Colega
- {
- //protected Coleguilla2()
- //{
- //}
- //private Coleguilla2()
- //{
- //}
- public int Edad { get; set; }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement