利用反射拿到并递归C#类中的各个字段名字及类型

   以下方法实现了遍历一个class中所有的字段, 并且递归遍历sub class。

 private StringBuilder _properties = new StringBuilder();

        public MainView()
        {
            TraversalProperties(typeof(StudyInfoModel));

            File.WriteAllText("Properties.txt", _properties.ToString());
        }


private void TraversalProperties(Type classTemplate)
        {
            if (null == classTemplate)
            {
                return;
            }
           
            foreach (PropertyInfo pi in
                classTemplate.GetProperties(BindingFlags.Public | BindingFlags.Instance| BindingFlags.DeclaredOnly))
            {
                PropertyInfo needUpdateValue = classTemplate.GetProperty(pi.Name);

                if (needUpdateValue.PropertyType.Equals(classTemplate))
                {
                    return;
                }

                if (needUpdateValue.PropertyType.IsArray
                    || (needUpdateValue.PropertyType.IsClass
                        && !needUpdateValue.PropertyType.IsGenericType
                        && !needUpdateValue.PropertyType.Equals(typeof(String))
                        && !needUpdateValue.PropertyType.IsValueType
                        )
                    )
                {
                    TraversalProperties(needUpdateValue.PropertyType);
                }
                else if (needUpdateValue.PropertyType.IsGenericType
                    &&  needUpdateValue.PropertyType.GetGenericTypeDefinition()== typeof(ObservableCollection<>))
                {
                    TraversalProperties(needUpdateValue.PropertyType.GetGenericArguments()[0]);
                }
                else
                {
                    if (classTemplate.Name.Contains("StudyInfoModel"))
                    {
                        _properties.AppendFormat("\"{0}\", ", needUpdateValue.Name);
                    }
                    else
                    {
                        _properties.AppendFormat("\"{0}_{1}\", ", classTemplate.Name.Replace("InfoModel", ""), needUpdateValue.Name);
                    }
                  
                }
            }
           
        }
posted @ 2013-07-03 11:02  muzizongheng  阅读(573)  评论(0编辑  收藏  举报
如果我们时时忙着展现自己的知识, 将何从忆起成长所需的无知?