通过反射能不能遍历一个对象的Fields,并得到相应的值?注意,是对象而不是某个类,我需要得到各Fields的值

解决方案 »

  1.   

    可以的
    using System;
    using System.Reflection;class TestField
    {
      private int i=12;
      protected string sabc = "a";
      public DateTime dt = DateTime.Now;  static void Main()
      {
    TestField tf = new TestField();
             foreach (FieldInfo fi in tf.GetType().GetFields(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic))
    {
    object o = fi.GetValue(tf);
    Console.WriteLine("name:{0}==>value:{1}", fi.Name, o.ToString());
    }
      }
    }
      

  2.   

    向 saucer(思归) ( ) 学习
      

  3.   

    顺便再问一下saucer(思归)大哥,是不是任何对象的private Fields都能通过此法读取它的值呢?
      

  4.   

    请教后下,如果
      private int i=12;
      protected string sabc = "a";
      public DateTime dt = DateTime.Now;
    还有一个:
      public Users objUser=new User("001","张三");
    其中User类为:
      class User
    {
      public string UserId=string.Empty;
      public string UserName=string.Empty;
      public User(string _userId,string _userName)
      {
        UserId=_userId;
        UserName=_userName;
    }

    如何得到User对象中的UserId,UserName呢,请大家帮忙!
      

  5.   

    见这个贴:
    http://community.csdn.net/Expert/topic/4293/4293461.xml?temp=.4418909
      

  6.   

    请 saucer(思归)等各位大侠帮帮忙!
      

  7.   

    向 saucer(思归) ( ) 学习
      

  8.   

    sing System;
    using System.Reflection;class User
    {
      public string UserId=string.Empty;
      public string UserName=string.Empty;
      public User(string _userId,string _userName)
      {
        UserId=_userId;
        UserName=_userName;
      }
    } class TestField
    {
      private int i=12;
      protected string sabc = "a";
      public DateTime dt = DateTime.Now;
      public User objUser=new User("001","张三");  static void Main()
      {
    TestField tf = new TestField();
            GetProperties(tf);
      }  static void GetProperties(Object t)
      {
    foreach (FieldInfo fi in t.GetType().GetFields(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic))
    {
    object o = fi.GetValue(t);
    Console.WriteLine("name:{0}==>value:{1}", fi.Name, o.ToString());
    if (fi.FieldType.IsClass && !(o is String))
    {
    GetProperties(o);
    }
    }
      }
    }
      

  9.   

    还想请问一个程序中的细节,你们用string.Empty是不是为了弥补变量没有初始化的缺陷?谢谢
      

  10.   


     谢谢 saucer(思归),正在试你提供的方法!十分感谢!
     Johnny_de(天才): 用string.Empty是为了弥补变量没有初始化的缺陷。
      

  11.   

    现在还有一个问题:
    t.GetType().GetFields(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic),用这句代码好像没办法得到TestField 的基类中的一些Field,不知道有没有其它途径可以实现?请大家指点!多谢~!
      

  12.   

    BindingFlags.GetField,得到所有指定的Field.
      

  13.   

    Johnny_de(天才) :你所说的"所有指定的Field",是什么意思?如上例,假设TestField 是由TestBase继承下来的,TestBase中有一个:public string bb="bb";,调用t.GetType().GetFields(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic)这句后,Fields集合中会有bb吗?
    我试过System.Reflection.PropertyInfo[] properties = tf.GetType().GetProperties();这样得不到bb!
      

  14.   

    t.GetType().GetFields(BindingFlags.Public|BindingFlags.Instance|BindingFlags.NonPublic)可以得到所有的属性,包括基类中的,是我自己弄错了,谢谢各位!
      

  15.   

    如果private Fields都能在类外部随便读/赋值,那是不是有点问题?
    按理来说private成员只能在类内部使用