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
Post by PedroComo 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