如何遍历一个未知类型的List(自己的类,比如List只有运行时才能确定这个Customer类型)的每个属性的值?

huangbochn 2018-05-11 11:30:17
标题比较短,不容易说清楚.
是这样的需求.我在不同的Winform窗体中都有LookIupEdit控件.数据源是List.比如List<Customer>.我要写一个通用的方法,用户在按下CTRL+V时,程序读取当前LookUpEdit控件的DisplayMember,然后根据DisplayMember遍历出对应的ValueMember.

现在KeyDown时间传递的datasource是object,我要转换成某个类型的List(只有运行时才知道是哪个类型).如果不转换,我就没办法遍历了.请问我应该怎么实现呢?还是我的思路就是错误的?

datatable可以实现我的需求,但是这样我就要大规模修改程序代码了.
...全文
672 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2018-05-12
  • 打赏
  • 举报
回复
反射 foreach (var p in obj.GetType().GetPropertities()) { p.Name是属性名 p.GetValue(obj, null); 是属性值 }
xuzuning 2018-05-12
  • 打赏
  • 举报
回复
你好像是被你自己绕糊涂了吧? 既然 lookupEdit 是第三方控件,那么除非 lookupEdit 提供了遍历功能,否则你遍历的只是作为 DataSource 的自定义的 List<T> 至于说你能(要)取到 dlookupEdit.DisplayMember 某项的值,那只是 DisplayMember 提供了索引器的缘故 至于 lookupEdit.DataSource 被申明成 object 却能感知 List<T> 的结构,那只是其内部使用了反射的原因,跟你的遍历没啥关系 GetProperties() 方法返回的是一个数组,虽然一般示例代码都用 foreach 去遍历 但谁也没阻止你用下标去访问。既然你只关心第二个属性的值,而不关心其含义的话,那你就用下标 1 去访问就是了
维秀斯丢丢 2018-05-12
  • 打赏
  • 举报
回复
反正想动态 ,目前只能用反射,取第二个属性这个 type.GetProperties()[1].GetValue();
维秀斯丢丢 2018-05-12
  • 打赏
  • 举报
回复
在不同的界面,你应该知道具体的类型,判断吧,然后再转对应类型。
huangbochn 2018-05-12
  • 打赏
  • 举报
回复
我补充代码说明下.lookupEdit是第三方控件,类似comboBox.一个valueMermber,一个DisplayMember. var lookupEdit = (LookupEdit)sender; var dataSource = lookupEdit.Properties.DataSource; //这里的dataSource是一个List. 我需要遍历这个dataSource第二列的值,并且和剪贴板的内容比较,如果一致就取的DisplayMember对应的valueMermber(实际上就是第一列的值.) 我需要请教的是,dataSource这个List<?>,这个?就是只有运行时才知道是哪个类.所以,我也可以不关心是哪个类了,我只要遍历就好了.
huangbochn 2018-05-12
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
(datasource asList<Customer>) 或 (List<Customer>)datasource
抱歉,可能我描述不清晰. 这里的Customer类是不确定的,我只是举例. 因为是一个通用的方法.所以LookUpEdit的数据源可能是List<Customer>也可能是List<Student>.只有运行时才是哪个类知道. 如果编码时已经知道是哪个类就简单了.
huangbochn 2018-05-12
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
反射 foreach (var p in obj.GetType().GetPropertities()) { p.Name是属性名 p.GetValue(obj, null); 是属性值 }
因为这里的类是不确定的,所以属性名也是不确定的(可能是customerName,也可能是StudentName……) 有没有办法类似DataTable那样遍历每一行呢?因为LookUpEdit的数据源,第一列肯定是Id,第二列是DispalyMember.我实际上可以不需要知道属性名.我只要比较第二列,如果相等就获取第一列的Id值,这样就达到目的了.
xuzuning 2018-05-12
  • 打赏
  • 举报
回复
(datasource asList<Customer>) 或 (List<Customer>)datasource
  • 打赏
  • 举报
回复
软件不过是一堆 0、1、0、1 ..... 的二进制符号,那么我们可以不可以说只要会这两个数字就会编程设计了呢? 其实同样的意思,软件设计要踏踏实实地按照好的规范经验理论来设计。虽然存在着“万能的”所谓做法,但是要分人、分场合,只有万分之一的场景才需要某些“技术”的时候如果滥用了,那么软件工程就成了空的了,一眼就能看出后期有什么危害。
  • 打赏
  • 举报
回复
引用 楼主 huangbochn 的回复:
datatable可以实现我的需求,但是这样我就要大规模修改程序代码了.
毫无面向应用的多 Class 与 interface 的 datatable 让你你就要大规模修改数据了,这其实是工程问题,就好像一个人问“如何用意念盖房子”一样了。这样下去,玩一点编程“技术”概念,很快就要去放弃技术研发而搞销售了。这个理念比技术语法形式更重要。
  • 打赏
  • 举报
回复
引用 楼主 huangbochn 的回复:
标题比较短,不容易说清楚. 是这样的需求.我在不同的Winform窗体中都有LookIupEdit控件.数据源是List.比如List<Customer>.我要写一个通用的方法,
如果你连个接口都不敢定义,例如定义 ICustomer,那么其实一切设计都是空中楼阁,后续的设计一定是不落地的。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧