InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder
Migración de WSE a WCF (Web Services de 2005 a 2008)
Generar archivos PDF con C#
TransactionScope - Simplificando el trabajo con transacciones.
LinQ To SQL - Un ejemplo sencillo
Cómo activar Intelisense (autocompletado) en el Web.config
Leer un campo XML de SQL Server 2005 con C#
TripleDES - Un ejemplo practico en C#
Mostrar un GridView dentro de un DataList
String.Format

Afiliados
La Web del programador
MundoProgramacion


 
C# y como crear instancias de clases desde un tipo String utilizando .NET FrameWork.

Uno de los mejores aliados con los que cuenta la programación orientada a objetos es el polimofismo, la capacidad de que nuestro programa se comporte de un modo u otro dependiendo de las circunstacias es una gran ventaja.

Habitualmente solemos utilizar el polimorfismo a través de interfaces o herencias que definen métodos que hacen override. A mi por ejemplo, me gusta definir un  determinado método y que reciba como argumento un objeto (o interface) que va a  realizar una determinada tarea, de este modo resuelvo el flujo del programa sin preocuparme de como realizar la tarea en cuestión.

Asumiremos que el lector tiene los conocimientos básicos necesarios sobre el lenguaje C#, el entorno .NET y la programación orientada a objetos.

El proyecto

Primero creamos un nuevo proyecto de consola con Visual Studio .NET, y llamaremos al namespace Devjoker.Ejemplos.CreateDeString. Para que el proyecto funcione correctamente el namespace debe tener este nombre.

Para poder ejecutar correctamente este ejemplo debemos incluir dos directivas using al principio del programa:

  • using System.Reflection;
  • using System.Runtime.Remoting;

El funcionamiento del programa es muy sencillo, creará un objeto que imprimirá en pantalla el mensaje "Hola Mundo" en castellano o en ingles, dependiendo de la entrada del usuario. Sí, ya se que esto se puede hacer con un simple if, ¡pero lo que queremos es crear objetos desde un tipo string!, así que no te preocupes de si se puede hacer de otra forma y sigue leyendo.

Para ello vamos a definir una interfaz IHolaMundo, que define un único método HolaMundo. Por otro lado , definiremos dos clases HolaMundoCastellano y HolaMundoIngles. Ambas clases implementarán la interfaz IHolaMundo.

El proyecto tendrá como punto de entrada la clase Principal, que definirá el método Main que servira de entrada a la ejecución del programa.

Vamos a definir la interfaz IHolaMundo:


interface IHolaMundo

string HolaMundo();
}//Fin de definición de la interface

Y ahora las dos clases HolaMundoCastellano y HolaMundoIngles, ambas implementan la interfaz IHolaMundo.


class HolaMundoCastellano: IHolaMundo
{
        public string HolaMundo()
         { 
        return "Hola Mundo"
         }
}//Fin de definición de HolaMundoCastellano
class HolaMundoIngles:IHolaMundo
{
          public string HolaMundo() 
         {
          return "Hello world"
         }
}//Fin de definición de HolaMundoIngles

Hasta ahora el código es tan sencillo que creo que no necesita comentario alguno.

Por último vamos a crear el metodo Main, dentro de la clase Principal. Recordemos que el namespace se llama Devjoker.Ejemplos.CreateDeString, este detalle es de vital importancia, ya que para instanciar la clase debemos proporcionar el nombre completo de la clase, con namespace incluido.

El código de la clase Principal es el siguiente:


 class Principal
 {
     /// 

     ///Punto de entrada de la aplicacion 
     ///
 
     [STAThread] 
     static void Main(string [] args) 
     {
      IHolaMundo oTest; 
      ObjectHandle ManipularObjeto; 

      Console.WriteLine ("Introduzca el nombre de la clase que quiere crear:"); 
      Console.WriteLine ("HolaMundoCastellano"); 
      Console.WriteLine ("HolaMundoIngles"); 

      string DatoUsuario = Console.ReadLine();
      string CadenaObjeto = "Devjoker.Ejemplos.CreateDeString." + DatoUsuario; 

      Assembly assembly = Assembly.GetExecutingAssembly(); 

      try
            ManipularObjeto = 
            AppDomain.CurrentDomain.CreateInstance(assembly.FullName, CadenaObjeto); 
            oTest = (IHolaMundo) ManipularObjeto.Unwrap(); 
            Console.WriteLine( oTest.HolaMundo()); 
            } 
      catch (Exception e) 
            {
            Console.WriteLine ("No se ha podido crear el objeto." ); 
            Console.WriteLine (e.Message ); 
            }  
      }
 }//Fin de la clase principal

Para que el ejemplo funcione correctamente debemos teclear el nombre de la clase que queremos instanciar, es decir uno de los dos literales que imprime el programa, HolaMundoCastellano o HolaMundoIngles.En caso contrario se producira una excepción.

Vamos a explicar que es lo que está haciendo este código.

Primero tenemos dos objetos, oTest y ManipularObjeto. El primero, oTest, es del tipo IHolaMundo que es la interfaz que definimos la principio del ejemplo. El segundo, ManipularObjecto, es del tipo ObjectHandle perteneciente al espacio de nombres System.Runtime.Remoting. Si vemos la documentación de esta  clase obtendremos la siguiente definición:

"La clase ObjectHandle ajusta referencias de objetos calculadas por valor, de este modo, se pueden devolver a través de un direccionamiento indirecto....La clase ObjectHandle se utiliza para pasar un objeto (en un estado ajustado) entre varios dominios de aplicaciones "

¿Y que demonios significa esto?, pues quiere decir que a través de esta clase podemos obtener referencias a objetos creados de forma indirecta, es decir, a través de los métodos CreateInstance que implementan algunas de las clases que componen el .NET framework, entre las que se encuentran los dominios de aplicación. Además, a través de este metodo podemos especificar desde que assembly queremos crear la instancia.

Lo que hacemos en el ejemplo obtener de la línea de comandos el nombre de la clase que queremos crear y llamar al método CreateInstance del dominio de aplicación actual. Este método recibe como argumentos el nombre del assembly y el nombre completo de la clase que queremos crear, si bien este método tiene varias sobrecargas que podemos consultar en la documentación de MSDN. Como resultado de la ejecución de este método obtenemos un objeto ObjectHandle, en la variable ManipularObjeto,  que representa la instacia creada. Por último convertimos el objeto al tipo IHolaMundo, utilizando el método Unwrap de ObjectHandle y llamamos a HolaMundo para imprimir el mensaje por pantalla.

Todo esto lo ponemos dentro de un bloque try para gestionar los posibles errores.

Utilizando esta técnica podemos llegar a crear sistemas realmente potentes, gracias a la capacidad que ofrece .NET framework de crear instancias definidas en diferentes assemblies, y es en este punto donde esta técnica es realmente potente.

Saludos y hasta la proxima.

Devjoker.


 Versión para imprimir  Foros de consulta

 
.. por .
Respuesta recibida el [16/06/2008 10:12:34]
oLaa??

 
.. por .
Respuesta recibida el [16/06/2008 10:12:47]
oLaa??

 
esta super por franco
Respuesta recibida el [17/07/2008 11:26:48]
he probado tu codigo y en comparación de este otro es más rápido el tuyo, claro esta se pueden hacer cosas de mas con este como optener info de los typos...

Object instancia = Activator.CreateInstance(Type.GetType("Paquete.clase"););
object[] args = new object[0];

return tipo.InvokeMember(nombreMetodo, BindingFlags.Default | BindingFlags.InvokeMethod, null, instancia, args);

 
Como seria para llamar una forma que se encuentra en un DLL por Edgar
Respuesta recibida el [06/08/2008 05:27:03]
Hola, tu ejemplo de crear un objeto desde un string si funciona bien, pero en mi caso particular, el objeto que quiero crear es una forma; pero este objeto de tipo Form, se encuentra dentro de un proyecto ya compilado en un archivo DLL

por lo cual de esta manera no se puede crear el objeto (form en mi caso), hay alguna otra manera de hacerlo...

estoy usando el siguiente codigo que si funciona para abrir objetos de tipo Form que se encuentran en el mismo proyecto:

string sForm = "UsingMenusStatusStripsToolStrips.Form2";

ObjectHandle ManipularObjeto;

Form oTest = null;

Assembly assembly = Assembly.GetExecutingAssembly();

try{

ManipularObjeto =

AppDomain.CurrentDomain.CreateInstance(assembly.FullName, sForm);

oTest = (Form)ManipularObjeto.Unwrap();

oTest.MdiParent = this;

oTest.Show();

}

catch (Exception exp) {

MessageBox.Show("No se ha podido crear el objeto." + exp.Message.ToString());


}



si dentro de mi proyecto X, tengo agregada una referencia a un DLL que en su interior tiene otros objetos de tipo Form, los cuales quiero abrir desde mi proyecto X, como deberia de hacerlo usando el codigo mencionado arriba?



gracias de antemano...

 
Sobre la forma de crear el objeto form por Alex
Respuesta recibida el [17/09/2008 06:07:10]
Lo que no queda claro es de que manera puedes manipular dinamicamente oTest para cambiar el nombre de acuerdo a una variable.

 
obtener el nombre de la clase en un metodo estatico por romer
Respuesta recibida el [17/10/2008 09:31:59]
necesito obtener el nombre de la clase actual en un metodo estatico de la misma,.. ya q por reflection invoco este metodo, pero necesito obtener el nombre de la clase para despues obtener una instancia,. .. si me pueden ayudar s elos agradecere,. 

saludos

 
para abrir un form de otro proyecto a mi me irve por Javier Hernandez
Respuesta recibida el [12/11/2008 10:10:29]
Dim ap As AppDomain = AppDomain.CurrentDomain
Dim ev As Evidence = ap.Evidence
'cargamos el ensamblado
dim miA = ap.Load("OtroEnsamblado", ev)
dim frm as object
frm = miA.CreateInstace("OtroEnsamblado.NombreForm")
ctype(frm, Form).Show()

 
y para obtener el resultado de un metodo publico hago esto por Javier Hernandez
Respuesta recibida el [12/11/2008 10:23:05]
dim ap as AppDomain = AppDomain.CurrentDimaint
Dim ev as Evidence = ap.Evidence
dim miA = ap.Load("OtroEmsamblado",ev)
dim oClase as object
oClase = miA.CreateInstance("OtroEnsamblado.NombreClase")
Dim m As MethodInfo = mia.GetType("OtroEnsamblado.NombreClase").GetMethod("UnaMetodoPublico")

Dim res As Object = m.Invoke(ob, New Object() {})

 
correccion al anterior post por Javier Hernandez
Respuesta recibida el [12/11/2008 10:28:37]
dim ap as AppDomain = AppDomain.CurrentDimaint
Dim ev as Evidence = ap.Evidence
dim miA = ap.Load("OtroEmsamblado",ev)
dim oClase as object
oClase = miA.CreateInstance("OtroEnsamblado.NombreClase")
Dim m As MethodInfo = mia.GetType("OtroEnsamblado.NombreClase").GetMethod("UnaMetodoPublico")

Dim res As Object = m.Invoke(oClase, New Object() {})


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

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

C# y como crear instancias de clases desde un tipo String utilizando .NET FrameWork.
Autor: Pedro Herrarte Sánchez
Visitas: 8086 Fecha de publicación: 16/04/2004
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: 302 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET|CSS|ASP.NET
Visitas: 137 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS
Visitas: 101 | Comentarios: 5 | Archivo: Articulos
Categorias: TFS
Visitas: 429 | Comentarios: 4 | Archivo: Articulos
Categorias: Transact-SQL|LinQ
Visitas: 1448 | Comentarios: 6 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|ADO.NET
27/09/2008 Navegando ....
Visitas: 238 | Comentarios: 0 | Archivo: Articulos
Categorias: Humor
Visitas: 611 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|WCF
Visitas: 2573 | Comentarios: 4 | Archivo: Articulos
Categorias: C#
Visitas: 463 | Comentarios: 0 | Archivo: Articulos
Categorias: JavaScript|ASP.NET
Visitas: 1072 | Comentarios: 0 | Archivo: Articulos
Categorias: Windows XP|Linux|Windows Vista

Útimos temas recibidos en los foros ...
Crystal reports XI Release 2 y asp.net por mvargas ... [ASP.NET] 0 21/11/2008
Enviar un email con C# utilizando .Net FrameWork 2.0 con logo... por Moises ... [ASP.NET] 0 21/11/2008
Enviar un email con C# utilizando .Net FrameWork 2.0 por Moises ... [C#] 0 21/11/2008
Cuestión de BFILE. por Megatron ... [ORACLE] 0 21/11/2008
Enviar email por Dol ... [ASP.NET] 5 21/08/2007
*******PREGUNTA********: por T.S.U.En Informatíca ... [Visual Basic 6.0] 5 17/03/2008
Programar tareas en oracle. por Rodrigo ... [ORACLE] 0 21/11/2008
fechas con datatimepicker por peyin ... [Visual Basic .NET] 3 20/11/2008
agregar datos de un gridview a un textbox por jhors ... [ASP.NET] 3 19/09/2007
Select de sql en c# por Stuart ... [C#] 1 20/11/2008
Manual en Español de SQL Navigator for Oracle por Maira ... [ORACLE] 12 30/03/2008
Como mandar mensaje a Celular por Pako ... [C#] 40 13/03/2007

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 ...
14/07/2006 Registros PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
01/06/2006 Cursores de actualización en PL/SQL    forma parte de...Tutorial PL/SQL
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
24/05/2006 Cursores Implicitos en PL/SQL    forma parte de...Tutorial PL/SQL
23/05/2006 Cursores en PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Consultar datos. SELECT    forma parte de...Tutorial SQL
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL
11/03/2008 Problemas en la instalación de Visual Studio 2008-Visual studio web authoring component
03/10/2006 Creación de objetos    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]