Se ho un codice come questo:Perché non è possibile ottenere nomi di variabili locali usando Reflection?
public class Program
{
public static void Main()
{
string bar = "";
int foo = 24;
}
}
posso ottenere le variabili locali dichiarate in Main
utilizzando:
var flag = BindingFlags.Static | BindingFlags.Public;
var fields = typeof(Program).GetMethod("Main", flags).GetMethodBody().LocalVariables;
Questo restituisce un IList<LocalVariableInfo>
e LocalVariableInfo
ha solo tre proprietà: IsPinned
, LocalIndex
e LocalType
. Quindi non esiste una proprietà Name
.
Quello che mi chiedo è che si possono vedere i nomi delle variabili nel generato IL code
:
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 11 (0xb)
.maxstack 1
.locals init ([0] string bar,
[1] int32 foo)
IL_0000: nop
IL_0001: ldstr ""
IL_0006: stloc.0
IL_0007: ldc.i4.s 24
IL_0009: stloc.1
IL_000a: ret
} // end of method Program::Main
ma non è possibile ottenere utilizzando Reflection
.IS perché le variabili locali non hanno un nome e sono accessibili solo dai loro indici (se sì, come lo ILDASM.exe
mostra i nomi?), o perché tale funzione non è implementata? O se è possibile utilizzare un altro modo, la domanda sarebbe, come?
Nota: ho visto alcune domande come this e la maggior parte di esse utilizza Expressions
per ottenere il nome della variabile. Non funziona se mi piacerebbe avere tutti i locali comprese le variabili temporanee generate dal compilatore.
I nomi sono presenti dopo aver rimosso i file PDB? – dasblinkenlight
@dasblinkenlight sono, ma vedo nomi temporanei come V_0 e V_1 invece di nomi attuali –