本文介绍对列表进行创建及赋值的反射操作

我们现在有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# 反射 操作列表类型属性的更多相关文章

  1. redis 的使用 ( list列表类型操作)

    list 数据类型 列表类型 list 类型是一个双向操作 从链表的头部或者尾部添加删除元素 list 既可以用作栈 也可以用作队列 list 链表的类型应用场合: 获取最新的 10 个用户的信息 s ...

  2. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  3. redis:list列表类型的操作

    1. list列表类型的操作 1.1. lpush/rpush key value [value ...] 链表的头部(左侧)或尾部(右侧)插入值 语法:lpush key value [value ...

  4. Python列表类型及常用操作

    Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...

  5. 通过反射,对javabean属性进行过滤操作

    /** * 根据属性名获取属性值 * @param fieldName 属性名 * @param o 传入对象 * @return */ private Object getFieldValueByN ...

  6. .Net 中的反射(动态创建类型实例) - Part.4

    动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...

  7. .Net 中的反射(动态创建类型实例)

    动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...

  8. Redis从基础命令到实战之列表类型(List)

    经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...

  9. python列表类型

    列表类型简介 列表类型是一个容器,它里面可以存放任意数量.任意类型的数据. 例如下面的几个列表中,有存储数值的.字符串的.内嵌列表的.不仅如此,还可以存储其他任意类型. >>> L ...

随机推荐

  1. MyBatis-Plus 代码生成器超详细讲解

    参见:    https://www.jianshu.com/p/9d8ab1bb84bb

  2. 关于Electron环境配置与一些相关的错误解决

    安装步骤: 1.安装NVM: 这个是nodejs的版本管理器,github上有一个nvm for windows,由于不能的nodejs的版本问题,可以自由进行切换. 下载地址:https://git ...

  3. 生产环境实现Docker部署宝塔面板

    生产环境中,为了避免极小概率的数据丢失,我们将容器内的宝塔文件映射到宿主机的目录中(您之后安装的 Nginx.MySQL 等服务均会挂载到宿主机目录).该方法是 Docker 部署宝塔面板的最优方案, ...

  4. 关于一维数组传入函数的使用 //西电oj214题字符统计

    #include<stdio.h> void count(char str[],int num[]){//形参用[],传递数组首地址后可以直接正常用数组str[i] int i; for( ...

  5. Adams:一种使接触力(力矩等等)失效的方法

    1 第一步:点击"运行脚本". 2 第二步:右击选择"仿真脚本",点击"创建". 3 第三步:选择"脚本类型"为&quo ...

  6. DBeaver的使用

    1.下载安装: https://dbeaver.io/download/ 2.下载后解压到指定目录,双击安装包: 然后 进行连接,在连接数据库的时候,会提示下载文件,下载的时候老是出错,选择强制下载就 ...

  7. windows tips

    u启动经典dos工具实现硬盘分区教程 https://jingyan.baidu.com/article/a3f121e4dbe55afc9052bbfe.html?st=2&net_type ...

  8. C#重点语法——反射

    ------------恢复内容开始------------ 一.含义 反射是指访问,检测或修改程序代码本身状态或行为的一种技术. 举例: 官方代码继承了IReflect ------------恢复 ...

  9. goujian

    第二章的内容先对第一张来说更偏向于技术性,在团队合作中,如何保证自己所负责模块的质量的稳定,这就对自身的技术和一些良好的代码书写习惯有一定的要求.这里除了之前接触的代码的整齐(段落划分),变量值和文件 ...

  10. JDK 7 HashMap 并发情况下的死锁问题

    目录 问题描述 详细解释 问题描述 JDK7的 HashMap 解决冲突用的是链表,在插入链表的时候用的是头插法,每次在链表的头部插入新元素.resize() 的时候用的依然是头插,头插的话,如果某个 ...