一个关于反射对像时获取List值的问题

问题描述

在使用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]

时间: 2024-12-30 06:24:42

一个关于反射对像时获取List值的问题的相关文章

javascript-JS的combobox加载清单时获取文本值并作为参数执行查询

问题描述 JS的combobox加载清单时获取文本值并作为参数执行查询 //注册的ComboBox //想在此处取出界面上文本框的值,作为action中方法的参数,如何处理 var StrNUMPSColumn = new Ext.form.ComboBox({ id : 'combo_num_ps', name:'strsqlhead.strWo', fieldLabel: lbl_num_ps, triggerAction: 'all', editable: true, width: 180

Android录音时获取分贝值的方法代码实例_Android

参考文章Android中实时获取音量分贝值详解:http://www.jb51.net/article/64806.htm public class MediaRecorderDemo { private final String TAG = "MediaRecord"; private MediaRecorder mMediaRecorder; public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*1

Android录音时获取分贝值的方法代码实例

参考文章Android中实时获取音量分贝值详解:http://www.jb51.net/article/64806.htm public class MediaRecorderDemo { private final String TAG = "MediaRecord"; private MediaRecorder mMediaRecorder; public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*1

实现一个简单的Java编译时注解处理器

简介 Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据.Java语言中的类.方法.变量.参数和包等都可以被标注.Java标注和Javadoc不同,标注有自反性.在编译器生成类文件时,标注可以被嵌入到字节码中,由Java虚拟机执行时获取到标注.根据元注解@Retention指定值的不同,注解可分为SOURCE.CLASS和RUNTIME三种类型.当被声明为SOURCE时,注解仅仅在源码级别被保留,编译时被丢弃:声明为CLASS时,注解会由编译器记录在clas

[开发故事]第四回:应用反射在运行时动态获取类型信息

引言 网友hbfly,对于我在[你必须知道的.NET]第三十回:.NET十年(下)一文中 关于"当应用attribute进行运行时反射"的论述,希望举例说明,他提出了自己 的想法:[你必须知道的.NET]第二十四回:认识元数据和IL(上)[你必须知道的.NET]第二十五回:认识元数据和IL(中)[你必须知道的.NET]第二十六回:认识元数据和IL(下) [MyAttribute("text.....")] public mymethod() { //我可以再方法内部

MYSQL客户机程序4—在运行时获取连接参数

    6.5 客户机程序4-在运行时获取连接参数     现在我们有了容易修改的防止出现错误的连接代码,我们要了解一些如何做某些比使用NULL 连接参数更灵巧的事情,如在运行时允许用户指定一些值.客户机程序3由于固定连接参数方面的缺陷,要想更改那些值中的任何一个,都必须编辑源文件并重新编译.这十分不方便,特别是想使程序用于其他人时.在运行时指定连接参数的一个通用的方法是使用命令行选项.MySQL分发包中的程序接受两种形式的连接参数,如表6 - 1所示.    与标准的MySQL客户机程序一致,

用c++ 做到在桌面上悬浮某个图标时获取这个图标的位置信息

问题描述 用c++ 做到在桌面上悬浮某个图标时获取这个图标的位置信息 就像 windows这样,悬浮后会有一个tips出来里面是位置信息 解决方案 使用shell扩展可以实现 参考:http://www.codeproject.com/Articles/448/The-Complete-Idiots-Guide-to-Writing-Shell-Exten 解决方案二: 至于根据快捷方式文件(.lnk)得到指向的文件和路径,参考:http://www.codeguru.com/cpp/com-t

键盘 第一响应者-如何在键盘弹出时获取当前界面的第一响应者

问题描述 如何在键盘弹出时获取当前界面的第一响应者 一个界面上又多个textfield当键盘弹出时怎么知道是哪个输入框在编辑呢 解决方案 当键盘弹出时,获取键盘高度关于键盘弹出时遮盖页面显示的解决方案关于键盘弹出时遮盖页面显示的解决方案 解决方案二: 什么语言了,什么都不说,html用document.activeElement获取当前焦点元素

我在表单中嵌入了一个视图,我怎样才能获取在这个“嵌入视图”中选中文档的信息呢?

问题描述 我在表单中嵌入了一个视图,我怎样才能获取在这个"嵌入视图"中选中文档的信息呢?????????各位大哥哥大姐姐,快點幫幫我吧! 解决方案 解决方案二:你是指怎样取到你在嵌入视图里选取的文档吧,只有将你需要执行的代码移到那个嵌入视图的ActionBar的按钮里面,然后就像在普通视图里的一样用db.unproccesedDcouemnts就可以取到了,默认嵌入视图是不显示ActionBar的,在嵌入视图的属性里设置一下就可以显示了.解决方案三:在主文档取不到嵌入视图的文档信息解决