con una riflessione dinamica e imbarazzante non di più?
-
03-07-2019 - |
Domanda
C # 4.0 introduce la parola chiave dynamic
, che cercherà in fase di esecuzione.
Questo significa che non avremo più bisogno di riflessioni imbarazzanti? In caso affermativo, puoi mostrarne un esempio?
Soluzione
Avremo ancora Reflection: l'utilizzo di 'dinamico' contro i normali oggetti CLR invocherà un dispatcher basato su Reflection.
Quindi - avremo ancora Reflection, ma sarà più facile da fare.
Ecco un esempio:
// Via 'dynamic'
dynamic dx = GetSomeCLRObject();
dx.DoSomething();
dx.SomeMember = 2;
// Via Reflection
object x = GetSomeCLRObject();
Type xt = x.GetType();
MemberInfo DoSomethingMethod = xt.GetMethod("DoSomething");
DoSomethingMethod.Invoke(x, null);
PropertyInfo SomeMemberProperty = xt.GetProperty("SomeMember");
SomeMemberProperty.SetValue(x, 2);
Non ti conosco, ma mi piace il primo. =)
In entrambi questi casi, non ottengo alcun controllo in fase di compilazione, nessun Intellisense, nessun supporto IDE - ma il primo caso è molto più espressivo del secondo.
Altri suggerimenti
L'invio dinamico è solo un possibile utilizzo di Reflection. Ci sono molte buone ragioni per interrogare una classe per la sua struttura, ottenere informazioni su quella struttura e visualizzarla in una forma o agire su di essa in qualche modo senza mai accedere dinamicamente ai membri. La riflessione è qui per restare. :)
Se vuoi esempi della parola chiave dinamica, ecco un video dal PDC di l'uomo stesso ne parla (e altre cose C # 4.0 correlate).
La dinamica farà molto per risolvere i problemi con metodi noti solo per nome, dove quel nome è noto e risolto in fase di compilazione - ma, naturalmente, tali metodi potrebbero anche essere espressi come interfacce se controlli i tipi.
Ci sono casi in cui dinamico
non è affatto d'aiuto:
- dove il nome del metodo non è noto al momento della compilazione (ovvero viene caricato dall'input di configurazione / utente)
- creazione di oggetti
- forse alcuni scenari generici
Gli usi più grandi che vedo per dinamico
sono:
- Interoperabilità COM (ovviamente)
- supporto operatore generico
- duck digitando dove non esiste un'interfaccia comune
- Interoperabilità DLR (vedi commenti)
Ma sicuramente non risolve ogni guaio di riflessione.