C#遍历/反射 属性/字段

public static string SortParam<T>(T t)
        {
            string tStr = string.Empty;
            if (t == null)
            {
                return string.Empty;
            }
            System.Reflection.PropertyInfo[] properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
            if (properties.Length <= 0)
            {
                return string.Empty;
            }
            foreach (System.Reflection.PropertyInfo item in properties.OrderBy(m => m.Name))//排序后组成字符串
            {
                string name = item.Name;//字段名称
                object value = item.GetValue(t, null);//值
                if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))
                {
                    if (value != null)
                        tStr += (string.Format("{0}{1}", name, value));
                }
                else
                {
                    SortParam(value);//集合字段递归
                }
            }
            //tStr = tStr.OrderBy(m => m).ToList();
            return tStr;
        }
public IList<T> GetData(SqlDataReader reader)  
    {  
        IList<T> list = new List<T>();  
        Type type = typeof(T);  
        PropertyInfo[] properties = type.GetProperties();  
  
        while (reader.Read())  
        {  
            T t = Activator.CreateInstance<T>();  
            for (int i = 0; i < properties.Length; i++)  
            {  
                properties[i].SetValue(t, reader[i + 1], null);  
  
            }  
  
            list.Add(t);  
        }  
  
        return list;  
    }