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>而 我想知道的是,您可以在生成的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文件中包含的调试信息.如果不存在,就无法找出名字. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |