C# 反射 操作列表类型属性
本文介绍对列表进行创建及赋值的反射操作
我们现在有TestA、TestB类,TestA中有TestB类型列表的属性List,如下:
1 public class TestA
2 {
3 public List<TestB> List { get; set; }
4 }
5 public class TestB
6 {
7 public TestB(string name)
8 {
9 Name = name;
10 }
11 public string Name { get; }
12 }
下面通过反射,给TestA.List进行赋值,output的期望是 “1,2”
1 var testA = new TestA();
2 var list = new List<TestB>() { new TestB("1"), new TestB("2") };
3 AddValueToListProperty(testA, nameof(TestA.List), list);
4 var output = string.Join(",", testA.List.Select(i => i.Name));
1. 确定列表及泛型时,可以直接设置属性值
1 private void AddValueToListProperty(object objectValue, string propertyName, List<TestB> list)
2 {
3 var propertyInfo = objectValue.GetType().GetProperty(propertyName);
4 propertyInfo.SetValue(objectValue, list, null);
5 }
2.确定属性是列表,但不确定列表的泛型时,通过列表的Add方式进行设置值
List<object> list按上方的方案1,是无法进行赋值的,因为类型不一样。会提示隐示转换异常。
1 private void AddValueToListProperty(object objectValue, string propertyName, List<object> list)
2 {
3 var propertyInfo = objectValue.GetType().GetProperty(propertyName);
4 var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(propertyInfo.PropertyType.GenericTypeArguments));
5 propertyInfo.SetValue(objectValue, newList, null);
6 var addMethod = newList.GetType().GetMethod("Add");
7 foreach (var item in list)
8 {
9 addMethod.Invoke(newList, new object[] { item });
10 }
11 }
如上,我们需要先创建一个空列表,对属性进行初始化。propertyInfo.PropertyType.GenericTypeArguments是列表的泛型类型
然后,获取列表的新增方法 newList.GetType().GetMethod("Add"),将List<object> list一项项添加到列表中。
3.不确定属性是否列表,也不确定列表的泛型,可以如下处理:
1 private void AddValueToListProperty(object objectValue, string propertyName, object list)
2 {
3 var propertyInfo = objectValue.GetType().GetProperty(propertyName);
4 if (typeof(System.Collections.IList).IsAssignableFrom(propertyInfo.PropertyType))
5 {
6 var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(propertyInfo.PropertyType.GenericTypeArguments));
7 propertyInfo.SetValue(objectValue, newList, null);
8 var addMethod = newList.GetType().GetMethod("Add");
9 foreach (var item in (IEnumerable)list)
10 {
11 addMethod.Invoke(newList, new object[] { item });
12 }
13 }
14 else
15 {
16 propertyInfo.SetValue(objectValue, list, null);
17 }
18 }
如果AddValueToListProperty方法是设置属性值的通用方法,一般可以按上面的方式进行处理。
当然上面的一些代码是简化后的处理,比如判断是否列表,还需要更严谨的判断见《C# 反射 判断类型是否是列表》
C# 反射 操作列表类型属性的更多相关文章
- redis 的使用 ( list列表类型操作)
list 数据类型 列表类型 list 类型是一个双向操作 从链表的头部或者尾部添加删除元素 list 既可以用作栈 也可以用作队列 list 链表的类型应用场合: 获取最新的 10 个用户的信息 s ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- redis:list列表类型的操作
1. list列表类型的操作 1.1. lpush/rpush key value [value ...] 链表的头部(左侧)或尾部(右侧)插入值 语法:lpush key value [value ...
- Python列表类型及常用操作
Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...
- 通过反射,对javabean属性进行过滤操作
/** * 根据属性名获取属性值 * @param fieldName 属性名 * @param o 传入对象 * @return */ private Object getFieldValueByN ...
- .Net 中的反射(动态创建类型实例) - Part.4
动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...
- .Net 中的反射(动态创建类型实例)
动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...
- Redis从基础命令到实战之列表类型(List)
经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...
- python列表类型
列表类型简介 列表类型是一个容器,它里面可以存放任意数量.任意类型的数据. 例如下面的几个列表中,有存储数值的.字符串的.内嵌列表的.不仅如此,还可以存储其他任意类型. >>> L ...
随机推荐
- jquery中,某些写法后来更新导致版本不支持的替代方法
等号后面的书写替换前面老的书写方法 $.browser.mozilla = /firefox/.test(navigator.userAgent.toLowerCase());$.browser.we ...
- 【LuckyFrame研究】环境准备
LuckyFrame官方使用手册:http://www.luckyframe.cn/book/yhsc/syschyy-24.html LuckyFrame在码云平台或是GitHub上都是分成二个项目 ...
- iframe跨域通信window.postMessage()方法
需求:A页面中要嵌入一个iframe,这个iframe是B页面,此时A页面需要得到B页面的一些信息. window.postMessage() 我们都知道浏览器的同源策略,即对于两个不同页面的脚本,只 ...
- Spring Boot笔记--Spring Boot相关介绍+快速入门
相关介绍 简化了Spring开发,避免了Spring开发的繁琐过程 提供了自动配置.起步依赖.辅助功能 快速入门 结果呈现: 相关过程: helloController.java package or ...
- Java笔记第十一弹
TCP通信程序 TCP发送数据 //需要进行三次握手 import java.io.*; public class Main{ public static void main(String[] arg ...
- sql server连接的基本使用(包含自身验证和连接Navicat)
自身验证的步骤 1.先默认使用Windows身份验证连接上SQL Server数据库 2.右键连接名称,选择属性 来到这个界面: 3.选中左侧的安全性 4.将服务器身份验证修改为SQL Server和 ...
- 布局管理器wx.BoxSizer
b = wx.BoxSizer( wx.VERTICAL ) b.Add(self.notebook1, 1, wx.EXPAND) self.parent.SetSizer(b) 解析以上代码原理, ...
- pyinstall打包工具使用简介
使用pyinstall进行多个文件打包,直接打包主入口文件即可 pyinstaller MainUI.py -F -n ServerMonitorv200 -i PIC.ico -w 此处MainUI ...
- 使用 GVM 搭建可维护的 Golang 开发环境
当你想完成 Golang 开发环境的便捷安装以及随时更新和保障多个版本的 Golang 共存的时候,就需要使用到 Golang 的专门版本管理工具 --gvm 本篇随笔记录了在 Ubuntu 下安装使 ...
- 当我把ChatGPT拉进群聊里,我的朋友都玩疯了
前言 近期ChatGPT可以说是太火了,问答.写论文.写诗.写代码,只要输入精确的prompt,他的表现总是让人惊喜.本着打不过就加入的原则.要是把ChatGPT拉入群聊中,会是怎样一番场景?说做就做 ...