1 知识点:
1.1 List<T> 实现IList接口
1.2 System.Reflection 反射
2 举例及实现(调试OK)
using System; using System.Text; using System.Reflection; using System.Collections; using System.Collections.Generic; namespace ConsoleApplication1 { public class Node { private int _id; private int _pid; private string _name; public Node() { } public Node(int id, int pid, string name) { _id = id; _pid = pid; _name = name; } public int ID { get { return _id; } set { _id = value; } } public int PID { get { return _pid; } set { _pid = value; } } public string Name { get { return _name; } set { _name = value; } } public override string ToString() { return "ID:" + _id + "\t" + "PID:" + _pid + "\t" + "Name:" + _name; } } class B { private object _dataSource; public object DataSource { get { return _dataSource; } set { _dataSource = value; } } //怎么遍历DataSource,取出ID,PID,Name属性值? public void RecursionList() { if (this._dataSource == null) return; if (!(this._dataSource is IList)) return; IList nodeList = (IList)this._dataSource;//知识点1 PropertyInfo[] props = nodeList[0].GetType().GetProperties();//知识点2 foreach (object node in nodeList) { foreach (System.Reflection.PropertyInfo prop in props) { object propValue = prop.GetValue(node, null);//知识点2 Console.WriteLine(string.Format("{0} = {1}", prop.Name, propValue)); } } } } //应用举例 class Program { static void Main(string[] args) { List<Node> listTree = new List<Node>(); listTree.Add(new Node(0, 1, "北京")); listTree.Add(new Node(1, -1, "中国")); listTree.Add(new Node(2, 6, "莫斯科")); listTree.Add(new Node(3, 0, "海淀区")); listTree.Add(new Node(4, 0, "朝阳区")); listTree.Add(new Node(5, 3, "上地")); listTree.Add(new Node(6, -1, "俄罗斯")); listTree.Add(new Node(8, -1, "美国")); B newB = new B(); newB.DataSource = listTree; newB.RecursionList(); Console.Read(); } } }
再更进一步:
当然,this._dataSource 可能不一定可迭待的
所以如下修改更完善
//怎么遍历DataSource,取出ID,PID,Name属性值? public void RecursionList() { if (this._dataSource == null) return; if (this._dataSource is IEnumerable) { IEnumerable nodeList = (IEnumerable)this._dataSource; foreach (object node in nodeList) { PropertyInfo[] props = node.GetType().GetProperties(); foreach (System.Reflection.PropertyInfo prop in props) { object propValue = prop.GetValue(node, null); Console.WriteLine(string.Format("{0} = {1}", prop.Name, propValue)); } } } else if (this._dataSource is IEnumerable)//其他类型呢? { ... 此时,你想到什么呢?什么要做可使扩展性更好呢? } }