2009-12-07 10 views
39

Molti elenchi di domande di interviste .Net (including the good ones) contengono la domanda: "Cos'è il Reflection?". Recentemente mi è stato chiesto di rispondere a questa domanda nel contesto di un quesito, una prova tecnica progettata per essere completata in 15 minuti su un foglio di carta bianca consegnatomi in una caffetteria. La mia risposta è stata la seguente: "Reflection ti permette di scoprire Metodi, Proprietà e Campi di qualsiasi oggetto in fase di esecuzione". In retrospettiva, la mia risposta spiega come è possibile utilizzare la riflessione, ma non spiega quale sia la riflessione. A mio avviso, la mia risposta è stata sufficiente per comunicare che ho capito quale riflessione è per ma non è andata così lontano da spiegare quale riflessione è.In 3 minuti, cos'è Reflection?

Quindi, per favore, nel contesto di .Net, con parole tue concise, definiamo che cosa Riflessione è. Non passare più di tre minuti a rispondere. Non fare riferimento a the .Net documentation, l'abbiamo visto tutti.

+1

"Non spendere soldi per più di 3 minuti, non fare riferimento alla documentazione ". . . non fare domande come questa Voto per chiudere. –

+6

Puoi chiuderlo se vuoi. Ho già delle buone risposte ed è per questo che ho fatto la domanda. – grenade

+0

@Binary Worrier, potrei essere stato fuorviante con la mia dichiarazione di non fare riferimento. Intendo dire che la risposta non dovrebbe essere "leggere i documenti in qualche url" piuttosto che non usare la documentazione per dare una buona risposta. – grenade

risposta

42

Reflection è la capacità di interrogare e interagire con il sistema di tipi in modo dinamico.

+0

Che bello! Molto conciso e "dinamico" dice molto. – grenade

+3

Ma allora, la parte di codice di un metodo del sistema di tipi? Mi sembra che tu interagisca con qualcosa di più del semplice sistema di tipi –

+1

@Vinko: i metodi sono definiti nel contesto dei tipi, quindi direi di sì, ma vedo il tuo punto. Ad essere sincero, non mi aspettavo di coprire tutti i dettagli della riflessione in una singola frase. –

9

Reflection è la consapevolezza CLR degli oggetti a livello di codice quali nomi di classi, metodi, ecc. Che viene esposto tramite un'API, ovvero System.Reflection, che consente a uno sviluppatore di sfruttare la conoscenza del runtime di queste informazioni nel codice.

Violazione delle regole: Ho modificato questa risposta dalla sua forma originale per motivi di precisione.

+0

Reflection non richiede il compilatore in fase di esecuzione. – Guge

+0

La consapevolezza del compilatore o la consapevolezza CLR? –

+2

Infatti, mi piace questa risposta modificando il compilatore per il runtime. –

6

Riflesso è come guardare il codice per il navigatore.

+4

voglio sapere anche cosa è il gazzing navale? – Pondidum

+3

qualcosa che riguarda il rifornimento di navi della marina. –

+0

oh navale come le navi ... l'unica cosa che potevo pensare era i tasti di pancia ... – Pondidum

11

una forma di introspezione cioè la capacità di scrivere codice che interroga il codice

+4

+1 Risposta IMO più comprensibile - ora capisco perché si chiama 'reflection' - come guardare allo specchio. – jacknad

4

Mi piace la tua risposta, ma vorrei anche ricordare che la riflessione è anche un modo di ottenere/ambiente privato/campi protetti/proprietà, che altrimenti non essere disponibile in fase di runtime.

+0

Reflection abilita questo ma non è una delle qualità di riscatto di Reflection IMO. I campi sono impostati come privati ​​per una ragione: stai violando l'incapsulamento usando Reflection come tale, quindi dovrebbe essere evitato se possibile. Inoltre, questa risposta è come usare la riflessione, non quale riflessione è. – antik

+0

Normalmente sono d'accordo con il tuo ragionamento, ma penso anche alla situazione in cui stai lavorando con un componente di terze parti che non hai altri accessi ma eseguendo l'hacking con Reflection. E sì, hai ragione, volevo solo menzionare qualcosa che non è stato detto nelle 5 precedenti risposte. Preferisco aggiungere qualcosa di non detto al thread invece di ripetere, anche se questo significa divergere un po 'dalla domanda ... purché possa aggiungere valore alla discussione :) – tzup

+1

Concordo sul fatto che non sia carina ma a volte davvero bisogno di qualcosa da un controllo di terze parti. Ho trovato una perdita di memoria in uno e non l'avrebbero patch per mesi, quindi ho usato il riflesso per farlo temporaneamente da solo. – PeteT

5

Durante la compilazione di un linguaggio .Net, il compilatore inserisce le informazioni sul programma nel file di programma. Queste informazioni possono essere utilizzate dal programma stesso o da altri programmi per scoprire quali classi il programma contiene, quali sono i loro metodi, proprietà, campi ed eventi. Le classi e i loro metodi, proprietà e così via possono essere utilizzati anche attraverso la riflessione, anche se l'altro programma non sa nulla di loro prima dell'esecuzione. Ciò consente a programmi diversi di essere liberamente accoppiati e rende possibili ogni tipo di programmazione entusiasmante. Reflection può anche essere utilizzato per creare classi aggiuntive nei programmi in esecuzione o nei file di programma.

+0

-1: in realtà non spiega la riflessione. Certo, è possibile ottenere le classi, i metodi, eccetera, tramite la riflessione, ma è un dolore farlo. È molto più semplice usarli staticamente. Reflection, tuttavia, può essere utilizzato per il runtime, piuttosto che compilare il rilevamento del tempo dei tipi e dei relativi metodi. – Arafangion

+0

Arafangion, la mia risposta contiene che cos'è la riflessione, come funziona, come può essere utilizzata e penso che la mia risposta includa effettivamente ciò che suggerisci nel tuo commento. Ti suggerisco di leggere le risposte prima di svenderle. – Guge

+0

Guge: A rigor di termini, sì, tuttavia non indica in realtà le implicazioni pratiche né la differenza tra riflessione in fase di compilazione e tempo di esecuzione, e non sono d'accordo su come consentire un accoppiamento lento. (Nel contesto di .NET, non fa differenza rispetto all'accoppiamento). Infatti, molto di ciò che si indica potrebbe essere fatto con C e il linker dinamico. (Hai ragione, comunque, questa è stata una mia risposta pignola ... Probabilmente non vale il downvote, comunque i downvotes hanno a malapena impatto sulla reputazione) – Arafangion

2

Reflection è il curriculum del codice.

+1

Vuoi dire _résumé_, ma mi sembrava troppo il significato di Errore Riprendi Avanti'. Devo cancellare la mia mente dai VB-ismi. –

8

Reflection è la capacità di un programma di gestirsi come dati.

+0

Si prega di elaborare – graumanoz

0

Reflection è sia metadata che Microsoft intermediate Language (MSIL) insieme racchiuso in un file Excutable (PE) portatile e accessibile in runtime da un meccanismo.

0

Reflection non è altro che la possibilità di accedere al metodo di altre DLL che non sono state incluse nel progetto (potrebbe essere il sistema o il proprio creato) in fase di esecuzione in modo dinamico. È anche utile evitare problemi di dipendenza circolare.

0

riflessione è la capacità di agire come un DIO (G eneraleO da operazioni D irettore ;-)) - si può 'vedere' la struttura interna di un assieme e fare varie leggi (Sistema. Reflection), appositamente progettato per il runtime, come l'interrogazione di tipi e relativi membri, la ricerca di interfacce o attributi, tipi di istanze non noti al momento della compilazione e persino la creazione di nuovi tipi (System.Reflection.Emit).

0

Utilizzando Reflection in C#, è possibile scoprire i dettagli di un oggetto, metodo e creare oggetti e richiamare metodi in fase di esecuzione.

using System; 
using System.Reflection; 

public class MyClass 
{ 
    public virtual int AddNumb(int numb1,int numb2) 
    { 
    int result = numb1 + numb2; 
    return result; 
    } 

} 

class MyMainClass 
{ 
    public static int Main() 
    { 
    // Create MyClass object 
    MyClass myClassObj = new MyClass(); 
    // Get the Type information. 
    Type myTypeObj = myClassObj.GetType(); 
    // Get Method Information. 
    MethodInfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 
    object[] mParam = new object[] {5, 10}; 
    // Get and display the Invoke method. 
    Console.Write("\nFirst method - " + myTypeObj.FullName + " returns " + 
         myMethodInfo.Invoke(myClassObj, mParam) + "\n"); 
    return 0; 
    } 
} 

sottostante Codice otterrà le informazioni sul tipo:

Type myTypeObj = Type.GetType("MyClass"); 

Il frammento di codice qui sotto vi ottenere informazioni del metodo di

Methodinfo myMethodInfo = myTypeObj.GetMethod("AddNumb"); 

Il seguente frammento di codice sarà invocare il metodo AddNumb:

myMethodInfo.Invoke(myClassObj, mParam);