InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
SQL
  Tutorial SQL
SQL Server
  Tutorial de Transact-SQL
ORACLE
  Tutorial PL/SQL
.NET
  Introducción a.NET
  Conceptos generales .NET
  Tutorial C#
  LinQ
  WCF
Reina Roja
  Humor
  Bibliografia
  Acerca de ...


Activator, crear objetos a partir de texto

Hace algunos años, en uno de los primeros articulos que escribí en devjoker - pulsa aqui para ver el artículo original - explicabamos la forma de crear instancias de un objeto a partir de un string con C#, algo que habia implementado con gran exito en proyecto Java anterior.

Para ello definiamos un interfaz, utilizamos el dominio de aplicacion actual para obtener un objeto con AppDomain.CurrentDomain.CreateInstance y posteriomente convertiamos y ejecutamos la interfaz. Muy al estilo del patrón de diseño Factory Method basado en interface,.

Lo que es la ignorancia - por aquellos tiempos andaba aprendiendo esto del .NET -, y es que el framework posee una clase especializa en realizar esta tarea. La clase Activator.

En este ejemplo vamos a hacer otra implementacion del patron de diseños factoria, pero está vez en lugar utilizar un interface vamos a utilizar una clase abstracta. Definimos una clase abstracta ProveedorPadre, y las clase que hereden de esta deben sobreescribir el método HacerAlgo<T> ¡más generico no se puede!

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ActivatorSample

{

class Program

{

static void Main(string[] args)

{

string typename = "OtroNamespace.Proveedor1";

if (args.Length > 0)

{

typename = args[0];

}

ProcessType( typename);

Console.ReadLine();

}

 

private static void ProcessType(string typename)

{

Type tipo = Type.GetType(typename);

if (typeof(ProveedorPadre).IsAssignableFrom(tipo))

{

ProveedorPadre director =

(ProveedorPadre)Activator.CreateInstance(tipo);

director.HacerAlgo<int>(1);

director.HacerAlgo<string>("parametros");

director.HacerAlgo<DateTime>(DateTime.Now);

}

else {

throw new

InvalidOperationException("No implementa ProveedorPadre");

}

}

}

 

public abstract class ProveedorPadre

{

public abstract void HacerAlgo<T>(T indata);

}

 

}

 

namespace OtroNamespace

{

public class Proveedor1 : ActivatorSample.ProveedorPadre

{

public override void HacerAlgo<T>(T indata)

{

Console.WriteLine(

"Se ha recibido en Proveedor 1 el dato: {0}",indata.ToString());

}

}

 

public class Proveedor2

{

public Proveedor2()

{

//Sencillamente no hereda de ProveedorPadre!

}

}

}

En este ejemplo hemos incluido una segunda clase Proveedor2 que no hereda de nuestra clase abstracta, para controlar el posible error. Si invocamos al programa y enviamos por parametro "OtroNamespace.Proveedor2" obtendremos una excepcion de tipo InvalidOperationException.

La pregunta ahora es inmediata ... ¿que método es mejor y cual debo utilizar? ... pues lo mismo dá porque AppDomain.CurrentDomain.CreateInstance lo que hace internamente es invocar a la clase Activator.

Si analizamos la clase Activator con .NET Reflector podemos observar su implementación:

 

public System.Runtime.Remoting.ObjectHandle

CreateInstance(string assemblyName, string typeName)

{

if (this == null)

{

throw new NullReferenceException();

}

if (assemblyName == null)

{

throw new ArgumentNullException("assemblyName");

}

return Activator.CreateInstance(assemblyName, typeName);

}

Saludos, DJK


 Versión para imprimir  Foros de consulta

 
sí<> por Mihai Mosor
Respuesta recibida el [29/10/2009 04:53:20]
Sí, más generico ni que puede ser. La verdad es que la implementación de las clases abstractas son muy útiles, en especial cuando se trata de actualizar un programa, algo parecido al estilo Windows, eso sí, genericos y clases de herencia. 
Muy bueno, este capítulo no lo había tocado hasta ahora, gracias por haberlo publicado.
Saludos();

 
La gracia de esto es la creaci... por UnoDePorAhí
Respuesta recibida el [02/11/2009 09:24:57]
La gracia de esto es la creación de objetos dinámicamente en tiempo de ejecución... ya que no hay que declarar el tipo de objeto explícitamente... aunque también se puede usar reflection.
Buen artículo


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

Activator, crear objetos a partir de texto
Autor: Pedro Herrarte Sánchez
Visitas: 690 Fecha de publicación: 29/10/2009
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 86 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 791 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 739 | Comentarios: 3 | Archivo: Articulos
Visitas: 3134 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14487 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1474 | Comentarios: 3 | Archivo: Articulos
Visitas: 690 | Comentarios: 2 | Archivo: Articulos
Visitas: 368 | Comentarios: 0 | Archivo: Articulos
Visitas: 2006 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 135 26/01/2010
pensiones por eduard ... [Visual Basic 6.0] 0 11/03/2010
Manual Visual Studio.NET por Shiko ... [Visual Basic .NET] 41 26/10/2006
cap de setmana genial por ramón ... [Java] 0 11/03/2010
cetificado de pension por RICARDDO RAFAEL SOLANO ORZCO ... [Actualidad] 0 11/03/2010
solicitud de aifiliacion a porvernir por julios ... [Actualidad] 2 11/03/2010
Solicitar el certificado de pensiones de Abelardo Alfonso Serrano Banegas C.C. 18 971 771 de Curumani Cesar por Marta ... [Actualidad] 0 11/03/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 50 10/02/2010
cerificado fondo horizonte de pensiones y cesantias por carlos fideligno torres herrera ... [Actualidad] 146 18/01/2010
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 109 28/01/2010
certificado de fondos de pensiones horizonte por mona ... [Actualidad] 5 03/03/2010
Certificado de afiliacion AFP (PENSIONES) Horizonte por Sandris ... [Actualidad] 68 30/01/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
03/10/2006 Fundamentos de C#    forma parte de...Tutorial C#
05/07/2007 Consultar datos en Transact SQL    forma parte de...Tutorial de Transact SQL
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
19/10/2006 Llamadas asíncronas    forma parte de...Tutorial C#
14/07/2006 Tablas PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Introducción SQL    forma parte de...Tutorial SQL
18/10/2005 Enviar emails a través de un servidor SMTP autenticado con Java
11/12/2006 Novedades de C# 2.0    forma parte de...Tutorial C#
11/12/2006 Genéricos    forma parte de...Tutorial C#
11/12/2006 Tipos parciales    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]