请问如何获得,程序作用域里的所有变量?比如:
1。一个method范围内, 里面定义了N个local变量, 我该如何列举出当前method的这些变量?
2。一个类里, 里面定义了N个local和public的变量, 我该如何列举出当前类中的这些变量?谢谢!请给实例代码,谢谢!

解决方案 »

  1.   

    public class Demo
        {
            private string _local1;
            private bool _local2;
            public string public1;
            public object public2;
            public void Foo()
            {
                int local1 = 10;
                int local2 = 100;
                Console.WriteLine(local1 + local2);
            }
        }    class Program
        {
            
            static void Main(string[] args)
            {
                Type type = typeof (Demo);
                BindingFlags flags = BindingFlags.Static |
                                     BindingFlags.Instance |
                                     BindingFlags.Public |
                                     BindingFlags.NonPublic;
                // 获取所有变量
                foreach (FieldInfo fieldInfo in type.GetFields(flags))
                {
                    Console.WriteLine(fieldInfo.Name);
                }
                
                // 所有方法
                foreach (MethodInfo methodInfo in type.GetMethods(flags))
                {
                    MethodBody body = methodInfo.GetMethodBody();
                    if(body == null)
                    {
                        continue;
                    }                // 所有局部变量。局部变量的名称似乎没法获取
                    foreach (LocalVariableInfo variable in body.LocalVariables)
                    {
                        Console.WriteLine(variable);
                    }
                }
                Console.ReadLine();
            }
      

  2.   

    编译后DLL里面不包含局部变量的名称。你可能会问Reflector里面怎么可以看到。
    其实Reflector的早期版本是看不到的。
    后来的版本中,Reflector是依靠Pdb文件得到这些信息的。对于用户自己写的Dll,只有当dll和pdb文件在同一目录下的时候才可以用reflector看到变量名。
      

  3.   

    谢谢 cppfaq.请问,我可以得到这些变量的值吗?如果有个对象实例的话。代码如何写?
      

  4.   

    Demo demo = new Demo();// 获取所有变量
                foreach (FieldInfo fieldInfo in type.GetFields(flags))
                {
                    Console.WriteLine(fieldInfo.Name);
                    Console.WriteLine(fieldInfo.GetValue(demo)); // 变量值
                }