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 -