Если у меня есть такой код:
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;
Это возвращает a 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
показывает имена?), или потому что такая функция не реализована? Или, если это возможно, используя другой способ, тогда будет вопрос: как?
Примечание. Я видел такие вопросы, как this, и большинство из них использует Expressions
для получения имени переменной. Это не работает, если я хотел бы получить все локальные жители, включая временные переменные, сгенерированные компилятором.