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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top