Reflection consente di esaminare in fase di esecuzione le stesse informazioni utilizzate dal compilatore in fase di compilazione. Di conseguenza, tutto ciò che si può fare con la riflessione può essere fatto senza riflessione durante la compilazione. Questo non significa che la riflessione non ha senso: potresti non sapere quale domanda esatta vuoi chiedere fino al runtime.
Se si conosce qualcosa al momento della compilazione, esprimerlo nel sistema di tipi. Questo ti permetterà di cogliere errori al momento della compilazione. Ad esempio,
string propVal = myObj.SomeProperty;
Qui stiamo dicendo che sappiamo per certo che al momento della compilazione myObj
ha una proprietà chiamata SomeProperty
che è di un tipo che è assegnabile a string
- e di fatto, anche se non è visibile qui, dobbiamo anche specificare un tipo di interfaccia o classe di myObj
.
string propVal = (string)myObj.GetType()
.GetProperty("SomeProperty")
.GetValue(myObj, null);
Qui stiamo dicendo che myObj
potrebbe avere quella stessa proprietà - o potrebbe non (nel qual caso ci arriveremo un'eccezione in fase di esecuzione).
Il secondo, con la riflessione, sembra brutto, ma in C# 4.0 sembrerà praticamente identico. Spesso è anche più lento, ma dipende dal contesto e probabilmente sarà meno vero per le caratteristiche dinamiche in C# 4.0.
La vera distinzione rimane, tuttavia: la versione tipizzata staticamente ci aiuta a trovare errori durante la compilazione, invece di ritardare questa scoperta fino al runtime.
Quindi, se si vuole sfruttare appieno il sistema di tipo statico per catturare i bug durante la compilazione, provare a indicare le proprie ipotesi tramite il sistema di tipi, che equivale a dire: evitare la riflessione tranne dove realmente necessario.
fonte
2009-07-30 19:09:57
Vedo molte opinioni ma nessuna discussione sulle migliori pratiche. –
Ci piace solo vedere il nostro nome in stampa. Vedere? -> –
Alcuni di voi hanno sottolineato che la riflessione ha un posto nei quadri, nei test, nelle derisioni, ecc. Che ne dite delle applicazioni line-of-business? – Mank