saber cuantos handers hay referenciados??

26/06/2007 - 19:48 por J. Ramon A. | Informe spam
alguien sabe como saber cuantos controladores de eventos hay instanciados a
1 evento de 1 objeto??
es decir, cuantos addhandlers hay activos??

Preguntas similare

Leer las respuestas

#1 Diego Jancic
27/06/2007 - 05:15 | Informe spam
Hola,
Esta solucion sirve solamente si el evento es definido por vos, sino
vas a tener que buscar otra solucion (y realmente no se si se puede):

int attacheados = 0;
public event UnEventHandler UnEvento
{
add
{
attacheados++;
UnEvento += value;
}
remove
{
attacheados--;
UnEvento -= value;
}
}

Avisa si necesitas otra solucion que sirva para las clases en donde no
tenes el codigo..

Saludos,
Diego
Respuesta Responder a este mensaje
#2 J. Ramon A.
27/06/2007 - 11:11 | Informe spam
esto ya lo hago, precisamente es para cuando no lo e definido yo la clase.
Actualmente lo que hago es esto mismo reemplazando eventos y aveces
sombreando de la clase base, pero me parece un poco chapuza.
Se ue hay una forma, una vez oi algo pero ni me acuerdo.




"Diego Jancic" escribió en el mensaje de
noticias:
Hola,
Esta solucion sirve solamente si el evento es definido por vos, sino
vas a tener que buscar otra solucion (y realmente no se si se puede):

int attacheados = 0;
public event UnEventHandler UnEvento
{
add
{
attacheados++;
UnEvento += value;
}
remove
{
attacheados--;
UnEvento -= value;
}
}

Avisa si necesitas otra solucion que sirva para las clases en donde no
tenes el codigo..

Saludos,
Diego

Respuesta Responder a este mensaje
#3 Angel J. Hernández M.
28/06/2007 - 04:20 | Informe spam
En realidad no veo la utilidad a esto que quieres, sin embargo lo que puedes
hacer es a través de Reflection recuperar información del evento y/o
delegado asociado. Hay unos miembros ocultos llamados _invocationCount,
_invocationList, _target. A partir del objeto que tiene el evento puedes
hacer ObjetoConEvento.GetType().GetEvents() ó solo llamas a GetEvent y le
pasas el nombre del evento, de ahí recuperas el callback ó delegado usado, y
de ahí puedes obtener los miembros ocultos que te acabo de mencionar. Sin
embargo, te repito no sé cuál será la necesidad de hacer esto... Lo que te
dijo Diego no es chapuza sino un buen approach para lo que quieres. Espero
te sea de utilidad.

Saludos,


Angel J. Hernández M.
MCP,MCAD,MCSD,MCDBA,MCT
Microsoft MVP
http://msmvps.com/blogs/angelhernandez




"J. Ramon A." wrote in message
news:
esto ya lo hago, precisamente es para cuando no lo e definido yo la clase.
Actualmente lo que hago es esto mismo reemplazando eventos y aveces
sombreando de la clase base, pero me parece un poco chapuza.
Se ue hay una forma, una vez oi algo pero ni me acuerdo.




"Diego Jancic" escribió en el mensaje de
noticias:
Hola,
Esta solucion sirve solamente si el evento es definido por vos, sino
vas a tener que buscar otra solucion (y realmente no se si se puede):

int attacheados = 0;
public event UnEventHandler UnEvento
{
add
{
attacheados++;
UnEvento += value;
}
remove
{
attacheados--;
UnEvento -= value;
}
}

Avisa si necesitas otra solucion que sirva para las clases en donde no
tenes el codigo..

Saludos,
Diego

Respuesta Responder a este mensaje
#4 J. Ramon A.
28/06/2007 - 10:59 | Informe spam
No me referia a que la solucion de diego fuese chapuza, eso esta perfecto
pero cuando uno define la clase. LLamo chapuza a mi forma de implementar
esto a clases que no e desarrollado.

Hay varios motivos, tanto para proyecto comun como para proyecto addin y
extensibilidad:

yo defino 1 clase que contiene miembros estaticos compartidos de
objetos, ejem button.
desde una 2º llamo a la 1º clase para que inicialice el button a uno
existente en 1 form y hago addhandler a click de este button.
Hasta aqui todo perfecto incluso haciendo esto mismo desde una 3º y 4º
clase haciendo el addhandler, los eventos se ejecutan bien en todas.
el meollo es cuando desde una clase x accedo a la 1º para que desasignar
button, es decir a nothing (en este momento ya no me interesa que haga
referencia a ese button en concreto y quiero que haga referencia a
nothing), - pues se siguen ejecutando los eventos hasta que destruyo
el button

Esto me pasa tanto en proyecto addin o extensibility haciendolo por ejemplo
con el objeto solution del ide. Me pasa creando un diseñdor personalizado a
un control para que haga esto en tiempo de diseño y me pasa en tiempo de
ejecucion haciendo esto mismo con un button cualquiera de 1 form de un
proyecto comun (sin diseñadores ni nada).

Para el tema de extensibilidad del ide del vs2005, tengo varios controles
montados en toolwindows que hacen referencia al objeto solution (necesito
saber cuando se abre cierra una solucion), en cada uno tengo un objeto que
obtiene hace referencia al objeto solution del ide, me creé una clase para
que contuviese todos estos objetos (solution, proyect, etc..) y hacer la
inicializacion desde esta y compartirlos, y desde los controles enlazar los
eventos, todo esto va a la perfecion hasta que le digo que el objeto
solution u otro sea nothing, SE SIGUEN EJECUTANDO LOS EVENTOS.








"Angel J. Hernández M." escribió en el mensaje de
noticias:
En realidad no veo la utilidad a esto que quieres, sin embargo lo que
puedes hacer es a través de Reflection recuperar información del evento
y/o delegado asociado. Hay unos miembros ocultos llamados
_invocationCount, _invocationList, _target. A partir del objeto que tiene
el evento puedes hacer ObjetoConEvento.GetType().GetEvents() ó solo llamas
a GetEvent y le pasas el nombre del evento, de ahí recuperas el callback ó
delegado usado, y de ahí puedes obtener los miembros ocultos que te acabo
de mencionar. Sin embargo, te repito no sé cuál será la necesidad de hacer
esto... Lo que te dijo Diego no es chapuza sino un buen approach para lo
que quieres. Espero te sea de utilidad.

Saludos,


Angel J. Hernández M.
MCP,MCAD,MCSD,MCDBA,MCT
Microsoft MVP
http://msmvps.com/blogs/angelhernandez




"J. Ramon A." wrote in message
news:
esto ya lo hago, precisamente es para cuando no lo e definido yo la
clase.
Actualmente lo que hago es esto mismo reemplazando eventos y aveces
sombreando de la clase base, pero me parece un poco chapuza.
Se ue hay una forma, una vez oi algo pero ni me acuerdo.




"Diego Jancic" escribió en el mensaje de
noticias:
Hola,
Esta solucion sirve solamente si el evento es definido por vos, sino
vas a tener que buscar otra solucion (y realmente no se si se puede):

int attacheados = 0;
public event UnEventHandler UnEvento
{
add
{
attacheados++;
UnEvento += value;
}
remove
{
attacheados--;
UnEvento -= value;
}
}

Avisa si necesitas otra solucion que sirva para las clases en donde no
tenes el codigo..

Saludos,
Diego






Respuesta Responder a este mensaje
#5 J. Ramon A.
28/06/2007 - 11:05 | Informe spam
despues de probar 20.000 formas, se me ha ocurrido que antes de hacer el
nothing de estos objetos, debe haber alguna forma para saber cuantos
handlers hay activos y destruirlos a mano desde la clase que contiene estos
objetos. Si alguien sabe otra ?




"J. Ramon A." escribió en el mensaje de
noticias:
No me referia a que la solucion de diego fuese chapuza, eso esta perfecto
pero cuando uno define la clase. LLamo chapuza a mi forma de implementar
esto a clases que no e desarrollado.

Hay varios motivos, tanto para proyecto comun como para proyecto addin y
extensibilidad:

yo defino 1 clase que contiene miembros estaticos compartidos de
objetos, ejem button.
desde una 2º llamo a la 1º clase para que inicialice el button a uno
existente en 1 form y hago addhandler a click de este button.
Hasta aqui todo perfecto incluso haciendo esto mismo desde una 3º y 4º
clase haciendo el addhandler, los eventos se ejecutan bien en todas.
el meollo es cuando desde una clase x accedo a la 1º para que
desasignar button, es decir a nothing (en este momento ya no me interesa
que haga referencia a ese button en concreto y quiero que haga referencia
a nothing), - pues se siguen ejecutando los eventos hasta que
destruyo el button

Esto me pasa tanto en proyecto addin o extensibility haciendolo por
ejemplo con el objeto solution del ide. Me pasa creando un diseñdor
personalizado a un control para que haga esto en tiempo de diseño y me
pasa en tiempo de ejecucion haciendo esto mismo con un button cualquiera
de 1 form de un proyecto comun (sin diseñadores ni nada).

Para el tema de extensibilidad del ide del vs2005, tengo varios controles
montados en toolwindows que hacen referencia al objeto solution (necesito
saber cuando se abre cierra una solucion), en cada uno tengo un objeto que
obtiene hace referencia al objeto solution del ide, me creé una clase para
que contuviese todos estos objetos (solution, proyect, etc..) y hacer la
inicializacion desde esta y compartirlos, y desde los controles enlazar
los eventos, todo esto va a la perfecion hasta que le digo que el objeto
solution u otro sea nothing, SE SIGUEN EJECUTANDO LOS EVENTOS.








"Angel J. Hernández M." escribió en el mensaje
de noticias:
En realidad no veo la utilidad a esto que quieres, sin embargo lo que
puedes hacer es a través de Reflection recuperar información del evento
y/o delegado asociado. Hay unos miembros ocultos llamados
_invocationCount, _invocationList, _target. A partir del objeto que tiene
el evento puedes hacer ObjetoConEvento.GetType().GetEvents() ó solo
llamas a GetEvent y le pasas el nombre del evento, de ahí recuperas el
callback ó delegado usado, y de ahí puedes obtener los miembros ocultos
que te acabo de mencionar. Sin embargo, te repito no sé cuál será la
necesidad de hacer esto... Lo que te dijo Diego no es chapuza sino un
buen approach para lo que quieres. Espero te sea de utilidad.

Saludos,


Angel J. Hernández M.
MCP,MCAD,MCSD,MCDBA,MCT
Microsoft MVP
http://msmvps.com/blogs/angelhernandez




"J. Ramon A." wrote in message
news:
esto ya lo hago, precisamente es para cuando no lo e definido yo la
clase.
Actualmente lo que hago es esto mismo reemplazando eventos y aveces
sombreando de la clase base, pero me parece un poco chapuza.
Se ue hay una forma, una vez oi algo pero ni me acuerdo.




"Diego Jancic" escribió en el mensaje de
noticias:
Hola,
Esta solucion sirve solamente si el evento es definido por vos, sino
vas a tener que buscar otra solucion (y realmente no se si se puede):

int attacheados = 0;
public event UnEventHandler UnEvento
{
add
{
attacheados++;
UnEvento += value;
}
remove
{
attacheados--;
UnEvento -= value;
}
}

Avisa si necesitas otra solucion que sirva para las clases en donde no
tenes el codigo..

Saludos,
Diego






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida