Почему невозможно получить имена локальных переменных с помощью Reflection?
Если у меня есть такой код:
public class Program
{
public static void Main()
{
string bar = "";
int foo = 24;
}
}
Я могу получить локальные переменные, объявленные вMain
с помощью:
var flag = BindingFlags.Static | BindingFlags.Public;
var fields = typeof(Program).GetMethod("Main", flags).GetMethodBody().LocalVariables;
Это возвращаетIList<LocalVariableInfo>
иLocalVariableInfo
имеет только три свойства:IsPinned
,LocalIndex
а такжеLocalType
.Так нетName
свойство существует.
Что мне интересно, так это то, что вы можете видеть имена переменных в сгенерированном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
но невозможно получить их используяReflection
Это потому, что локальные переменные не имеют имени и доступ к ним осуществляется только по их индексам (если да, то какILDASM.exe
показывает имена?) или потому что такая функция не реализована? Или, если это возможно, используя другой способ, то вопрос будеткак?
Примечание: я видел некоторые вопросы, такие какэтот и большинство из них используетExpressions
чтобы получить имя переменной. Это не работает, если я хотел бы получить все локальные переменные, включая временные переменные, сгенерированные компилятором.