摘自:csdn
给一个对象属性赋值可以通过PropertyInfo.SetValue()方式进行赋值,但要注意值的类型要与属性保持一致。   

创建对象实例的两种方法:

1.

var obj = Assembly.Load("AssemblyName").CreateInstance("AssemblyName"+"ClassFullName");

2. var obj = Activator.CreateInstance(ClassType);

创建好实例时,现在可以给当前实例的某个属性赋值,首先获取要赋值的属性。

var property = obj.GetType().GetProperty("PropertyName");//此时可以使用GetProperty获取属性数组,循环进行赋值,这里主要讲解类型问题。

赋值可通过PropertyInfo.SetValue()方法,详见MSDN。

情况1,该属性类型是已知类型,例如:int

int value=500;
property.SetValue(obj,value,null);

这里需要注意value值的类型必须和属性类型一致,否则会抛出TargetException异常。

情况2,该属性类型是已知类型,原值是其他类型。例如:目标类型为int,值为string

string value="500";
property.SetValue(obj,int.TryParse(value),null);//类型转换。

前两种情况都很简单,有时业务会比较复杂,对目标类型不确定,需要程序运行时判断。

情况3,该属性类型是未知非泛型类型,不确定目标类型,如何进行类型转换。

object value="500";
property.SetValue(obj,Convert.ChangeType(value,property.PropertyType),null);//类型转换。

这样就可以解决大多数问题了。

不知道大家有没有注意,我在第三种情况强调了非泛型,难道泛型就不行了吗?
是的。如果只是用Convert.ChangeType()方法,类型转换仍然报错,先看下面的代码。

即使目标类型和值的类型是一致,通过Convert.ChangeType()进行转换仍然报错。
解决这个问题,就要先把属性值类型转成基类型后,在进行Convert转换。看代码这样,在使用Convert.ChangeType()转换可空类型时,就不会报错了。
再增加一些基础的判断验证,代码就比较完善了。

if (!property.PropertyType.IsGenericType){//非泛型property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, property.PropertyType), null);}else{//泛型Nullable<>Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition();if (genericTypeDefinition == typeof(Nullable<>)){property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, Nullable.GetUnderlyingType(property.PropertyType)), null);}}

转载于:https://www.cnblogs.com/Chavezcn/p/7537211.html

C#通过对象属性名修改值相关推荐

  1. 修改对象属性名的两种方法

    每天都能遇到奇奇怪怪的问题哈 修改前的数据 let HouChen = [{ name: '羽神', 年龄: 13, sex: '女', userList: [{ id: 1, Z_name: '钢铁 ...

  2. javascript动态修改对象的属性名

    在做东钿业务系统的时候,经常碰到写很多重复的ajax对接,于是就想封装一个方法,但是接收data的字段名不一样,所以就需要用到动态对象属性名这个写法了.其实很简单.直接看一下代码吧. 转载于:http ...

  3. JavaScript中的对象的属性名和属性值

    1.属性名 创建一个对象 var obj =new Object(); 向对象中添加属性 obj.name ="Jerry"; 那么,name就是属性名,"Jerry&q ...

  4. 对象的属性名和属性值

    属性名 var obj = new Object() //对象的属性名不强制要求遵守标识符 obj.name = 'wen sha bi'; //如果需要使用特殊的属性名,不能采用 . 的方法 //需 ...

  5. 对象的属性名与属性值

    注意共有5个步骤,按顺序操作下去 1.在对象中保存的值称为属性,对象的属性名不强制要求遵守标识符规则,什么名称都可以,我对象属性的语法:1对象.属性名,注意:如果对象中没有的属性,不报错而是返回und ...

  6. fastjson将对象转为json时属性名首字母会默认小写,如何自定义

    Java对象属性名 private String SrOrder; 得到的json为srOrder而不是SrOrder,而我们想要SrOrder这个key 只需要在属性名上加上@JSONField(n ...

  7. js 中对象--属性相关操作

    查询属性: 可以用 对象.属性 来查询属性和属性方法               或者                    对象["属性"]  来查询属性和属性方法 演示代码: ...

  8. es6 作为属性名的 Symbol

    作为属性名的 Symbol 由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性.这对于一个对象由多个模块构成的情况非常有用 ...

  9. 43.属性名和属性值

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>属性名 ...

最新文章

  1. [bzoj 2456]mode
  2. JS面向对象高级特性
  3. Java内存模型(转载)
  4. 小米2019开发者大会:核心技术集体亮相,推动下一代超级互联网
  5. UESTC 914 方老师的分身I Dijkstra
  6. AltRun调用cmd并刷新DNS
  7. 互联网架构师必备技能(使用markdown编写)
  8. python运行代码无反应_linux执行python命令后没有反应,不打印日志信息
  9. 二十三、小程序中的三级下拉框(下拉菜单)
  10. linux编辑框软键盘自动弹出,带输入框的Dialog自动弹出软键盘
  11. Quorum工作原理
  12. java 批量文件编码转换 GBK to UTF-8(swing界面)
  13. 【Android】安卓四大组件之内容提供者
  14. 2015.04.20,外语,读书笔记-《Word Power Made Easy》 11 “如何辱骂敌人” SESSION 30
  15. 大数据哪个省才是高考地狱_是一名数据科学家,确实是地狱附近最性感的工作...
  16. 国内免费软件开发外包平台发展
  17. android防丢器设计,☆基于51单片机的无线防丢器设计|可以防止儿童走丢的神奇...
  18. Nacos系列(12)-Nacos1.3.2注册中心nacos.discovery配置参数详解
  19. CEAC 之《企业信息化管理》3
  20. ORA-28001: the password has expired 密码超时解决办法

热门文章

  1. 读书笔记-你不知道的JavaScript(上)
  2. 关于静态编译出现的问题以及解决方法
  3. 2013下半年(11月)信息系统项目管理师考试题型分析(综合知识、案例分析、论文)...
  4. 花了两天时间为我的引擎实现了性能分析的界面显示
  5. Ant 构建文件的一种写法
  6. 请问asp.net网页里能显示tiff格式的图片吗?
  7. Hybrid 通信方式
  8. HTML的基本知识(一)——标题标签
  9. oracle进程的作用,浅析Oracle10g新进程 MMON 和 MMNL的作用
  10. 个人所得税如何填写最划算?