c# – 为什么不能使用Reflection来获取局部变量名?

前端之家收集整理的这篇文章主要介绍了c# – 为什么不能使用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.So,没有Name属性存在.

我想知道的是,您可以在生成的IL代码中看到变量名称

.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这样的问题,其中大多数是使用表达式来获取变量名.如果我想获得所有本地人,包括由编译器生成的临时变量,它不起作用.

解决方法

您必须区分人性化的基于文本的CLI形式和CLI的机器可读编译形式.

在文本CLI中,局部变量确实可以有名字(参见Damien的回答中所述的ECMA-335的§II.15.4.1.3).

但是在二进制形式中,局部变量没有名称.为此,请参见§II.23.2.6,其中指定了方法的局部变量签名(其所有局部变量的列表)的二进制格式.并且它不包含任何提到变量名称

所以,如果一些工具想知道一个局部变量的原始名称,它必须查看PDB文件中包含的调试信息.如果不存在,就无法找出名字.

猜你在找的C#相关文章