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

我们现在有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. CSS3之伸缩布局

    一 主轴方向 在伸缩布局中, 默认伸缩项是从左至右的排版的 主轴的排版的方向默认就是row, 默认就是从左至右 1.默认情况下主轴是水平方向的, 但是也可以修改为垂直方向.只要看到flex-direc ...

  2. AE|蒙版、遮罩、轨道遮罩全面解析

    相信很多初学者都有这样的困惑,搞不清蒙版和遮罩这两个概念的区别,甚至有的人认为它们就是一个东西. 这两个看似一样的概念,其实是有很大的区别的,今天主要从定义和作用方式这两个方面进行解析,相信对各位认识 ...

  3. Tensorflow learning notebook

    How does tensorflow work 原著blog https://jacobbuckman.com/#posts

  4. pandas加速读取数据记录csv大文件处理

    def readf(file): t0 = time.time() data=pd.read_csv(file,low_memory=False,encoding='gbk' #,nrows=100 ...

  5. yield总结

    1.使用yield  i def my_generator(n): for i in range(n): temp = yield i print(f'我是{temp}') g = my_genera ...

  6. 01-第一个Spring程序

    1.导包 所有和spring有关的包(有mybatis包的忽略),后期会使用maven引入 2. 引入spring的配置文件 可命名为applicationContext-service.xml或sp ...

  7. OSPF之路由撤销1

  8. [imx6ull][nand] uboot烧录固件

    背景 在调试阶段使用nxp的mfg-tools烧录比较麻烦,故考虑使用uboot指令实现固件烧录 烧录方法 //烧写内核 nand erase 0x4000000 0x800000 tftp zIma ...

  9. 痞子衡嵌入式:我为2021 TencentOS Tiny AIoT应用创新大赛做了场直播培训

    TencentOS Tiny AIoT 应用创新大赛是腾讯 TencentOS 团队联合恩智浦半导体.安谋科技(Arm China)发起的线上开发者活动,主要面向中小企业嵌入式工程师.广大嵌入式开发者 ...

  10. 笔精墨妙,妙手丹青,微软开源可视化版本的ChatGPT:Visual ChatGPT,人工智能AI聊天发图片,Python3.10实现

    说时迟那时快,微软第一时间发布开源库Visual ChatGPT,把 ChatGPT 的人工智能AI能力和Stable Diffusion以及ControlNet进行了整合.常常被互联网人挂在嘴边的& ...