Wenn ich einen Code wie folgt:Warum ist es nicht möglich, lokale Variablennamen mit Reflection zu erhalten?
public class Program
{
public static void Main()
{
string bar = "";
int foo = 24;
}
}
Ich kann die lokalen Variablen in Main
erklärt bekommen mit:
var flag = BindingFlags.Static | BindingFlags.Public;
var fields = typeof(Program).GetMethod("Main", flags).GetMethodBody().LocalVariables;
Dies gibt eine IList<LocalVariableInfo>
und die LocalVariableInfo
hat nur drei Eigenschaften: IsPinned
, LocalIndex
und LocalType
. So gibt es keine Name
Eigenschaft existiert.
Was ich frage mich, ist, dass Sie die Variablennamen in der generierten IL code
sehen:
.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
aber es ist nicht möglich, sie Reflection
.ist es zu bekommen verwenden, da lokale Variablen nicht eine haben Name und sie werden nur von ihren Indizes zugegriffen (wenn ja, wie die ILDASM.exe
zeigt die Namen?), oder weil eine solche Funktion nicht implementiert ist? Oder wenn es möglich ist, einen anderen Weg zu verwenden, dann wäre die Frage wie?
Hinweis: Ich habe einige Fragen wie this gesehen und die meisten von ihnen verwenden Expressions
, um Variablennamen zu erhalten. Es funktioniert nicht, wenn ich alle lokalen einschließlich temporärer Variablen, die vom Compiler generiert wurden, erhalten möchte.
Sind Namen nach dem Entfernen von PDB-Dateien vorhanden? – dasblinkenlight
@dasblinkenlight sie sind, aber ich sehe temporäre Namen wie V_0 und V_1 anstelle der tatsächlichen Namen –