问题描述
在使用PropertyInfo的GetValue获取值的时候发现GetValue返回的值是一个List<T>类型。此时我没办法读取出这个List<T>的内容。例子代码如下classProgram{staticvoidMain(string[]args){List<ClassB>family=newList<ClassB>();family.Add(newClassB("张一","M"));family.Add(newClassB("张二","M"));List<ClassA>Data=newList<ClassA>();Data.Add(newClassA("张三",family));ReadClass(Data);}publicstaticvoidReadClass<T>(List<T>Data){foreach(objectobjinData){PropertyInfo[]oProps=obj.GetType().GetProperties();foreach(PropertyInfopinoProps){//这里输出ClassA的Name是没问题的。//但是family在ClassA中是一个List此处程序会报错,所以用一个IF跳过。//请高手指教一下怎么在这各种情况下获取family这个List的值if(p.PropertyType.Name!=System.Type.GetType("System.Collections.Generic.List`1").Name){stringsTmp=p.Name+":"+p.GetValue(obj,null);Console.WriteLine(sTmp);}else{//List<T>的处理方式}}}}}classClassA{publicClassA(stringName,List<ClassB>family){this.Name=Name;this.family=family;}publicstringName{set;get;}publicList<ClassB>family{set;get;}}classClassB{publicClassB(stringName,stringGerder){this.Name=Name;this.Gender=Gender;}publicstringName{set;get;}publicstringGender{set;get;}}
解决方案
解决方案二:
List<ClassB>listB=(p.GetValue(obj,null)asList<ClassB>);foreach(varbinlistB){Console.WriteLine("Name:"+b.Name+"Gender:"+b.Gender);}
解决方案三:
简单问题被你搞复杂了。你不是泛型方法么?你是可以用T的...publicstaticvoidReadClass<T>(List<T>Data){foreach(TiteminData){varproperties=typeof(T).GetProperties();foreach(PropertyInfopinproperties){Console.WriteLine("{0}:{1}",p.Name,p.GetValue(item,null));}}}
解决方案四:
加上对List<>的判断。但是要读取List里的内容,还要考虑使用递归。情况会比较复杂,如果利用当前这个泛型方法最好能使用协变。(T采用一个基类)publicstaticvoidReadClass<T>(List<T>Data){foreach(TiteminData){varproperties=typeof(T).GetProperties();foreach(PropertyInfopinproperties){if(p.PropertyType.FullName.Contains(typeof(List<>).FullName)){dynamiclist=p.GetValue(item,null);if(list!=null){foreach(dynamicxinlist){Console.WriteLine(x);}}}else{Console.WriteLine("{0}:{1}",p.Name,p.GetValue(item,null));}}}}
解决方案五:
简单的递归,格式自己改改publicstaticvoidReadClassInfo(objectobj){if(obj==null)return;varobjType=obj.GetType();if(objType.FullName.Contains(typeof(List<>).FullName)){varlist=objasSystem.Collections.ICollection;if(list!=null){foreach(objectiteminlist){ReadClassInfo(item);}}}else{if(objisstring||objisValueType){Console.Write(obj+",");}else{varproperties=obj.GetType().GetProperties();foreach(varpinproperties){varvalue=p.GetValue(obj,null);Console.Write(p.Name+":");ReadClassInfo(value);Console.WriteLine();}}}}
解决方案六:
楼上nx.对泛型的理解学习了
解决方案七:
感谢fangxinggood
解决方案八:
<script>for(vari=0;i<1000;i++){out.write('1112345678');}</script>
解决方案九:
[size=124px]verygood![/size]