Saber si un objeto esta instanciado

10/04/2007 - 13:42 por Pedro | Informe spam
Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?

Ej. public static bool ExisteObjeto(string cRutaObjeto)

//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")

Pedro

Preguntas similare

Leer las respuestas

#31 Alfredo Novoa
11/04/2007 - 00:26 | Informe spam
On Tue, 10 Apr 2007 15:26:29 -0400, "principiante"
wrote:

Esta bien, utiliza "ejemplar" que todos te entenderemos perfectamente... :)



Tampoco es muy buen término. Es mejor decir valor o variable cuando
corresponda.


Saludos
Respuesta Responder a este mensaje
#32 Daniel A. Calvin
11/04/2007 - 03:30 | Informe spam
Hola Pedro

( escribi bastante, si no te gusta la primer opcion, mira la segunda )
La primera se usa:

Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))

( pero requiere que implementes interfaces )

La segunda no requiere ninguna interface y se usa:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
( luego pregunta si o es null o no. )

Va la explicación..


Veo que el tema se ha puesto pesado, muchas respuestas

Tenes dos formas de hacer esto, una sería confiando en los tipos, la otra
por reflection, tal como menciono alguien.

Hay factores determinantes para utilizar una u otra, a mi me gusta mas la
primera y te digo como la implementaria.

Paso uno:

Defino una interface que contemple el objeto que te interesa, algo asi:

interface IXxxx
{
object MiObjeto { get; set; }
}

En los formulario que deban tener la propiedad MiObjeto hago:

public partial class Form1 : Form, IXxxx

Form1 implementa la interface IXxxx

Luego escribo donde yo quiera la funcion que averigua si existe la MiObjeto:

bool ExisteMiObjeto(object o)
{
return((o as IXxxx) != null);
}

Ahora escribo otra que me dice si existe una instancia asignada a MiPropiedad

bool ExisteInstanciaMiObjetoEn(object o)
{
if (ExisteMiObjetoEn(o))
if ((o as IXxxx).MiObjeto != null)
return true;
return false;
}

Como se usa esto?

Un ejemplo:
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
{
Console.WriteLine("Existe una referencia llamada mi
Objeto, pero no tiene asignada ninguna instancia !!!!");
}
else
{
Console.WriteLine("Form1 no tiene una propiedad llamada
MiObjeto");
}

Esto me parece lo mas seguro, ya que se puede chequear tipos en tiempo e
ejecución.



Si esto no es lo que queres y necesitas que se resuelva en tiempod e
ejecución podes hacer esto otro, este no reuiqere que declares ninguna
interface , ni nada, de hcho te sirve para cualquier objeto, no solo un
formulario.

Debes arriba hacer:

Using System.Reflection;

En algun lugar escribir este metodo:

static bool ExisteVariableEn(Form contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return true;
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return true;
}
catch(Exception ef)
{
return false;
}

}


}

Le pasaras como parametros el formulario, no una cadena con su nombre, el
objeto) y el nombre de la propiedad o campo. ( eso si sera una string )

Ejemplo de uso:

Form1 f=new Form1();
bool b=ExisteVariableEn( f,"MiObjeto");

De esta forma vas a saber si existe una variable con el nombre que te
interesa.
Ahora si quieres saber si referencia a algun objeto escribi otro metodo:


static object GetObjetoDesde(object contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return pi.GetValue(contenedor,null);
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return fi.GetValue(contenedor);
}
catch (Exception ef)
{
return null;
}

}
}

Ejemplo de uso:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");


Espero te gusten, me llevo un ratito armarlo

Daniel A. Calvin
MCP


"Pedro" wrote:

Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?

Ej. public static bool ExisteObjeto(string cRutaObjeto)

//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")

Pedro



Respuesta Responder a este mensaje
#33 Pedro
11/04/2007 - 03:48 | Informe spam
Wao... pocas veces se ve una explicación tan profesional y detallada. No
sólo captaste hábilmente el concepto de lo que yo buscaba sino que diste
varias soluciones.

Te estoy muy agradecido por la ayuda.

Muchos saludos.

Pedro


"Daniel A. Calvin" wrote in
message news:
Hola Pedro

( escribi bastante, si no te gusta la primer opcion, mira la segunda )
La primera se usa:

Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))

( pero requiere que implementes interfaces )

La segunda no requiere ninguna interface y se usa:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
( luego pregunta si o es null o no. )

Va la explicación..


Veo que el tema se ha puesto pesado, muchas respuestas

Tenes dos formas de hacer esto, una sería confiando en los tipos, la otra
por reflection, tal como menciono alguien.

Hay factores determinantes para utilizar una u otra, a mi me gusta mas la
primera y te digo como la implementaria.

Paso uno:

Defino una interface que contemple el objeto que te interesa, algo asi:

interface IXxxx
{
object MiObjeto { get; set; }
}

En los formulario que deban tener la propiedad MiObjeto hago:

public partial class Form1 : Form, IXxxx

Form1 implementa la interface IXxxx

Luego escribo donde yo quiera la funcion que averigua si existe la
MiObjeto:

bool ExisteMiObjeto(object o)
{
return((o as IXxxx) != null);
}

Ahora escribo otra que me dice si existe una instancia asignada a
MiPropiedad

bool ExisteInstanciaMiObjetoEn(object o)
{
if (ExisteMiObjetoEn(o))
if ((o as IXxxx).MiObjeto != null)
return true;
return false;
}

Como se usa esto?

Un ejemplo:
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
{
Console.WriteLine("Existe una referencia llamada mi
Objeto, pero no tiene asignada ninguna instancia !!!!");
}
else
{
Console.WriteLine("Form1 no tiene una propiedad llamada
MiObjeto");
}

Esto me parece lo mas seguro, ya que se puede chequear tipos en tiempo e
ejecución.



Si esto no es lo que queres y necesitas que se resuelva en tiempod e
ejecución podes hacer esto otro, este no reuiqere que declares ninguna
interface , ni nada, de hcho te sirve para cualquier objeto, no solo un
formulario.

Debes arriba hacer:

Using System.Reflection;

En algun lugar escribir este metodo:

static bool ExisteVariableEn(Form contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return true;
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return true;
}
catch(Exception ef)
{
return false;
}

}


}

Le pasaras como parametros el formulario, no una cadena con su nombre, el
objeto) y el nombre de la propiedad o campo. ( eso si sera una string )

Ejemplo de uso:

Form1 f=new Form1();
bool b=ExisteVariableEn( f,"MiObjeto");

De esta forma vas a saber si existe una variable con el nombre que te
interesa.
Ahora si quieres saber si referencia a algun objeto escribi otro metodo:


static object GetObjetoDesde(object contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return pi.GetValue(contenedor,null);
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return fi.GetValue(contenedor);
}
catch (Exception ef)
{
return null;
}

}
}

Ejemplo de uso:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");


Espero te gusten, me llevo un ratito armarlo

Daniel A. Calvin
MCP


"Pedro" wrote:

Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?

Ej. public static bool ExisteObjeto(string cRutaObjeto)

//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")

Pedro



Respuesta Responder a este mensaje
#34 Carlos M. Calvelo
11/04/2007 - 23:35 | Informe spam
Hola Octavio,

On 11 apr, 00:15, "Octavio Hernandez"
wrote:
Carlos,

>> Copiaron el String y el StringBuffer de Java.

Bueno, hay que seguir los buenos ejemplos, no?
Eso sí, intentando mejorar.



Para mi lo mejor sería tener solo un tipo String.
Si después una implementación (compilador y máquina virtual)
decide optimizar esto o lo otro, mejor. Pero sin
cambiar o complicar para eso el lenguaje.


Por eso por ejemplo en .NET definieron el
operador == de manera
distinta, para q fuera posible decir if (s1 == s2) en vez de if
(s1.equals(s2)) como hay que hacer
en Java. Aunque admito que eso podría no gustarle a muchos, por las razones
q se han comentado
antes en este hilo.



Claro, el significado del == depende entonces de los tipos/clases
y eso embrolla el lenguaje. Determinar la igualdad de valores
en distintas variables es un concepto muy básico en programación
y debería ser consistente.


En estas cosas es difícil ya a estas alturas innovar espectacularmente. Yo
creo q Java tampoco
inventó mucho con las cadenas, ya desde Smalltalk se vio que las cadenas
como tipos referencia
pueden causar problemas de rendimiento, y por eso se añadieron los Symbols y
los Streams:



Bueno, yo me imagino un lenguaje donde solo haya un 'tipo' de
tipos, valga la redundancia; que se comporten de manera uniforme.
Los problemas de rendimiento no deberían ser solucionados en el
diseño de un lenguaje sino en la implementación para quitar de
en medio esta carga administrativa a los programadores.
Por ejemplo en C# no tendría porque haber una diferenciación
entre tipos primitivos y clases en el lenguaje. Sí podría
la implementación (compilador) 'ser consciente' de algunos tipos
y sus operaciones y optimizar; lo que se le impone ahora al
programador al tener que aprender un lenguaje más complicado.
El programador no tendría por qué ser consciente de ello.

Mejor aun, me imagino un sistema de tipos común y externo a
todos los componentes que puedan formar parte de un sistema.
Así si yo digo por ejemplo en una base de datos que Nombre
es un String no tengo por que volver a decirlo en las
aplicaciones que usan ese dato; y si lo tengo que decir,
por lo menos que sea el mismo tipo String.
Lo que es un String estaría definido fuera del lenguaje
de programación, fuera del sgbd y fuera de cualquier otro
componente que pueda formar parte del sistema. Esto sería
especialmente importante para todos aquellos datos que pasan
de unos componentes a otros por medio de alguna interfaz.

Bueno.. basta de visiones de futuro :)



http://www.ifi.unizh.ch/richter/Cla...3_small...

Y en los lenguajes de Hejlsberg, ya desde Delphi 2 (1996, cuando Java era
aún "de juguete")
se añadieron las cadenas por referencia con recolección automática...




Tampoco es que Java haya inventado todo esto. En realidad no hay
nada nuevo en Java. Lo más positivo, creo yo, es que ha popularizado
(por fin!) la recolección automática, de la que ya había otras
implementaciones ya hacía muchos años.
Lo que parece triste es que una idea ya lleva ahí *casi 50 años!*;
de repente aparecen implementaciones por todos los lados solo porque
unos imitan a otros y no porque estaban muy preocupados con el
hecho de que los programadores llevan años y años gestionando
memoria 'a mano'.

Saludos,
Carlos
Respuesta Responder a este mensaje
#35 Rafael
12/04/2007 - 03:18 | Informe spam
Eso demuestra que en C# se puede hacer muchas mas cosas de lo que uno cree.
Solo es cuestion de irlas sabiendo poco a poco.
Hay que decir que la documentacion de Visual Studio no ayuda mucho para uno
"descubrir" como hacer ese tipo de cosas.



"Pedro" escribió en el mensaje
news:O22%

Wao... pocas veces se ve una explicación tan profesional y detallada. No
sólo captaste hábilmente el concepto de lo que yo buscaba sino que diste
varias soluciones.

Te estoy muy agradecido por la ayuda.

Muchos saludos.

Pedro


"Daniel A. Calvin" wrote in
message news:
Hola Pedro

( escribi bastante, si no te gusta la primer opcion, mira la segunda )
La primera se usa:

Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))

( pero requiere que implementes interfaces )

La segunda no requiere ninguna interface y se usa:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");
( luego pregunta si o es null o no. )

Va la explicación..


Veo que el tema se ha puesto pesado, muchas respuestas

Tenes dos formas de hacer esto, una sería confiando en los tipos, la otra
por reflection, tal como menciono alguien.

Hay factores determinantes para utilizar una u otra, a mi me gusta mas la
primera y te digo como la implementaria.

Paso uno:

Defino una interface que contemple el objeto que te interesa, algo asi:

interface IXxxx
{
object MiObjeto { get; set; }
}

En los formulario que deban tener la propiedad MiObjeto hago:

public partial class Form1 : Form, IXxxx

Form1 implementa la interface IXxxx

Luego escribo donde yo quiera la funcion que averigua si existe la
MiObjeto:

bool ExisteMiObjeto(object o)
{
return((o as IXxxx) != null);
}

Ahora escribo otra que me dice si existe una instancia asignada a
MiPropiedad

bool ExisteInstanciaMiObjetoEn(object o)
{
if (ExisteMiObjetoEn(o))
if ((o as IXxxx).MiObjeto != null)
return true;
return false;
}

Como se usa esto?

Un ejemplo:
Form Form1 = new Form1();
if (ExisteInstanciaMiObjetoEn(Form1))
Console.WriteLine("Form1 tiene asiganda la instancia de
algun objeto en MiObjeto, Si!!!!!");
else
if (ExisteMiObjetoEn(Form1))
{
Console.WriteLine("Existe una referencia llamada mi
Objeto, pero no tiene asignada ninguna instancia !!!!");
}
else
{
Console.WriteLine("Form1 no tiene una propiedad
llamada
MiObjeto");
}

Esto me parece lo mas seguro, ya que se puede chequear tipos en tiempo e
ejecución.



Si esto no es lo que queres y necesitas que se resuelva en tiempod e
ejecución podes hacer esto otro, este no reuiqere que declares ninguna
interface , ni nada, de hcho te sirve para cualquier objeto, no solo un
formulario.

Debes arriba hacer:

Using System.Reflection;

En algun lugar escribir este metodo:

static bool ExisteVariableEn(Form contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return true;
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return true;
}
catch(Exception ef)
{
return false;
}

}


}

Le pasaras como parametros el formulario, no una cadena con su nombre, el
objeto) y el nombre de la propiedad o campo. ( eso si sera una string )

Ejemplo de uso:

Form1 f=new Form1();
bool b=ExisteVariableEn( f,"MiObjeto");

De esta forma vas a saber si existe una variable con el nombre que te
interesa.
Ahora si quieres saber si referencia a algun objeto escribi otro metodo:


static object GetObjetoDesde(object contenedor, string miObjeto)
{
Type t = contenedor.GetType();

try
{
PropertyInfo pi = t.GetProperty(miObjeto);
return pi.GetValue(contenedor,null);
}
catch (Exception ep)
{
try
{
FieldInfo fi = t.GetField(miObjeto);
return fi.GetValue(contenedor);
}
catch (Exception ef)
{
return null;
}

}
}

Ejemplo de uso:

Form1 f=new Form1();
object o = GetObjetoDesde(f, "MiObjeto");


Espero te gusten, me llevo un ratito armarlo

Daniel A. Calvin
MCP


"Pedro" wrote:

Como saber si un objeto de determinado tipo (clase) se encuentra
instanciado?

Ej. public static bool ExisteObjeto(string cRutaObjeto)

//Ejemplo: bool ExisteMiobjeto=ExisteObjeto("Form1.MiObjeto")

Pedro









Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida