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.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC