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

前端之家收集整理的这篇文章主要介绍了c# – 为什么不能使用Reflection来获取局部变量名?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有这样的代码
  1. public class Program
  2. {
  3. public static void Main()
  4. {
  5. string bar = "";
  6. int foo = 24;
  7. }
  8. }

我可以得到在Main中声明的局部变量:

  1. var flag = BindingFlags.Static | BindingFlags.Public;
  2. var fields = typeof(Program).GetMethod("Main",flags).GetMethodBody().LocalVariables;

这返回一个IList< LocalVariableInfo>而LocalVariableInfo只有三个属性:IsPinned,LocalIndex和LocalType.So,没有Name属性存在.

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

  1. .method public hidebysig static void Main() cil managed
  2. {
  3. .entrypoint
  4. // Code size 11 (0xb)
  5. .maxstack 1
  6. .locals init ([0] string bar,[1] int32 foo)
  7. IL_0000: nop
  8. IL_0001: ldstr ""
  9. IL_0006: stloc.0
  10. IL_0007: ldc.i4.s 24
  11. IL_0009: stloc.1
  12. IL_000a: ret
  13. } // 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#相关文章