136 messaggi dal 15 febbraio 2009
Ho incontrato un piccolo problema che mi sta portando via più tempo del previsto.

Allora: ho due differenti controlli Silverlight, a e b, di cui uno viene scaricato normalmente dentro una pagina html, mentre l'altro viene scaricato in differita dal server, in modo da diminuire lo spazio occupato su disco e il peso del download iniziale.

In questo caso, però, ho la necessità di "condividere" alcune informazioni da 'b' ad 'a', nella fattispecie quando uno degli elementi nella gerarchia di b viene selezionato con il mouse.

Per fare questo, ho aggiunto a 'b' un paio di eventi standard(con delegato System.Windows.EventHandler e parametri EventArgs).

La mia intenzione è di gestire questi eventi all'interno di a, in modo che la classe padre possa reagire in modo appropriato. Avendo scaricato un Assembly, non possiedo a runtime informazioni dettagliate sul tipo, e quindi tutto - compresi gli eventi - vanno recuperati tramite reflection.
Qui iniziano i problemi. Ecco lo stralcio di codice:

 
/* definizione del metodo di a che dovrebbe fare da handler per l'evento firato da b */ 
 
public void MyHandler(object sender, EventArgs e) { 
//... 
} 
 
/* supponiamo che FrameworkElement obj sia l'oggetto appena istanziato dall'Assembly */ 
 
Type _class = obj.GetType() //recupero la classe 
 
EventInfo _event = _class.GetEvent("EventName"); //recupero l'evento 
 
Type _delegateType = _event.EventHandlerType; //recupero il tipo del delegato 
 
MethodInfo _Minfo = this.GetType().GetMethod("MyHandler", BindingFlags.Instance | BindingFlags.NonPublic); 
 
/* linea che genera un'eccezione */ 
Delegate _del = Delegate.CreateDelegate(_delegateType, _Minfo); 


Questo codice solleva un'ecceziona al momento di invocare il metodo statico Delegate.CreateDelegate.
Il solo modo di evitare questo errore è modificare il codice come segue:

 
 
/* rendiamo statico il metodo */ 
private static void MyHandler(object sender, EventArgs e) { 
//... 
} 
 
MethodInfo _Minfo = this.GetType().GetMethod(BindingFlags.Static | BindingFlags.NonPublic); 
 


Questo codice funziona correttamente.
Riassumendo: l'unico modo per creare un delegato sembra essere un metodo statico, altrimenti cicca. Ma usando un metodo statico ovviamente non sono comodo ad accedere alle istanze..

é normale questo comportamento? Non capisco a cosa sia dovuto.

Tnx
Modificato da TheCat il 29 luglio 2009 20.15 -
personalmente utilizzerei Prism, lo trovi si codeplex
http://compositewpf.codeplex.com/

necessità di un minimo di apprendimento, ma ne verrai ripagato per la modularità

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
136 messaggi dal 15 febbraio 2009
Già lo conosco, la prima volta che Alessio me l'ha linkato l'ho scaricato e ho iniziato a studiarmelo; mi sembra un po' sovradimensionato per un progetto di dimensioni relativamente piccole come quello a cui sto attendendo in questa occasione.

Se proprio non riesco a risolvere in tempo utile, passerò a reimplementare tutto con PRISM.

Comunque non capisco il perchè di questi comportamenti inspiegabili nella Reflection.. Boh?
136 messaggi dal 15 febbraio 2009
La soluzione è semplice:

il metodo CreateDelegate non può sapere nulla a prescindere dell'oggetto a cui si fa riferimento, per cui la soluzione consiste nell'utilizzare un diverso overload:

 
 
private void MyHandler(object sender, EventArgs e){ 
//... 
} 
 
... 
MethodInfo _MInfo = this.GetType().GetMethod("MyHandler", BindingFlags.NonPublic | BindingFlags.Instance); 
 
Delegate _del = Delegate.CreateDelegate(_delegateType, obj, _MInfo); 


E tutto riprende a funzionare a dovere.
La confusione nasce dal fatto che la documentazione ufficiale in merito su MDSN
http://msdn.microsoft.com/it-it/library/ms228976(VS.95).aspx

Riporta soltanto un esempio di utilizzo del primo overload, che è in grado di recuperare soltanto un metodo statico.
Modificato da TheCat il 30 luglio 2009 14.28 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.