public class test
    {
        public string UserName;
        public string PassWord;
        public string Mail;
        public string Phone;
        public string School;
    }这样的一个类通过反射来获得该类的字段名称的字符串数组代码这样的:
test myclass = new test();
Type vType = myclass.GetType();
FieldInfo[] vFieldInfos = vType.GetFields();
//vFieldInfos[i].Name就是字段的字符串了
//而且vFieldInfos的Length就是类中字段的个数
但是如果是这样的类就不行了。public class UserInfo
    {
        public virtual int ID { get; set; }
        public virtual string UserID { get; set; }
        public virtual string UserName { get; set; }
        public virtual string PassWord { get; set; }
        public virtual string SafeCode { get; set; }
        public virtual string Question1 { get; set; }
        public virtual string Answer1 { get; set; }
        public virtual string Question2 { get; set; }
        public virtual string Answer2 { get; set; }
        public virtual string Mail { get; set; }
        public virtual string TrueName { get; set; }
        public virtual string Sex { get; set; }
        public virtual string PersonID { get; set; }
        public virtual string Job { get; set; }
        public virtual string PlaceFrom { get; set; }
        public virtual string Role { get; set; }
    }
用上面相同的反射代码,发现得到的vFieldInfos长度居然是36,而且vFieldInfos[i].Name是一些奇怪的字符串(这是在调用类库中的类情况下),如果写在现在的当前的源文件中,则vFieldInfos竟然得不到。
怎么办呢?我有个别人编译好的类库,就是一个dll,里面有个类,就是上面的第二个类的样子,里面全是
public virtual string xxx { get; set; }
这样的属性。我该怎么获得它的各个字段的名称?

解决方案 »

  1.   

    也就是得到"ID","UserID","UserName"  ...  这样的字符串
      

  2.   

    属性是虚的, 字段可不是.虚的属性要找到对应的字段, 是一个运行时的行为, 是动态的.而通过 type 来获取, 得到的估计也是动态获取字段用的代码, 而不是字段本身.
      

  3.   

    vType.GetProperties 可能是你要的吧
      

  4.   

      System.Reflection.MemberInfo info = typeof(test);
          object[] attributes = info.GetCustomAttributes(true);
          for (int i = 0; i < attributes.Length; i ++)
          {
             System.Console.WriteLine(attributes[i]);
          }
    使用 MethodInfo 了解方法的名称、返回类型、参数、访问修饰符和实现详细信息(如 abstract 或 virtual)等。
    使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。参考
      

  5.   

    用LS的方法得出来attributes长度为0PS问下:如何用反射得到类中的字段的值?用这样的代码能得到字段名称test res=new test();
    ...
    Type vType = res.GetType();
    FieldInfo[] vFieldInfos = vType.GetFields();
    MemberInfo[] MemInfoArray = vType.GetMembers();其中MemberInfo的前面一部分值是Get 和set 然后中间有一部分是字段的名称字符串了,后面又是一部分奇怪的字符串了
      

  6.   


    test res = new test();
    //...
    Type vType = res.GetType();
    FieldInfo[] vFieldInfos = vType.GetFields();
    MemberInfo[] MemInfoArray = vType.GetMembers();
    PropertyInfo[] df=vType.GetProperties();然后df[i]的哪个属性是字段名称呢?能不能获得该字段的值呢?
      

  7.   

    参考:            UserInfo ui = new UserInfo();
                ui.ID = 1;
                ui.UserID = "u1";
                ui.UserName = "sdfjsdlfjs";
                //....
                foreach (PropertyInfo pi in ui.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
                {
                    Console.WriteLine("属性名:{0},值:{1}", pi.Name, pi.GetValue(ui, null));
                }