通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值
通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值注意:若不动态转换属性的值,简单调用SetValue方法赋值经常出错!特别是日期类型、带符号的数字类型等。
解决方案:
通过TypeDescriptor.GetConverter方法获取对应数值类型的转换器,然后调用ConvertFromString方法进行转换。
C# Code:
/// <summary>
/// 通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值
/// </summary>
/// <param name="obj">对象实例</param>
/// <param name="propertyName">属性名称</param>
/// <param name="sValue">字符类型的数值</param>
private void SetPropertyValue(object obj, string propertyName, string sValue)
{
PropertyInfo p = obj.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (p != null)
{
object dynmicValue;
if (p.PropertyType.IsArray)//数组类型,单独处理
{
p.SetValue(obj, sValue, null);
}
else
{
//根据属性类型动态转换属性的值
if (String.IsNullOrEmpty(sValue.ToString()))//空值
dynmicValue = p.PropertyType.IsValueType ? Activator.CreateInstance(p.PropertyType) : null;//值类型
else
dynmicValue = System.ComponentModel.TypeDescriptor.GetConverter(p.PropertyType).ConvertFromString(sValue.ToString());//创建对象
//调用属性的SetValue方法赋值
p.SetValue(obj, dynmicValue, null);
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
/// <summary>
/// 通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值
/// </summary>
/// <param name="obj">对象实例</param>
/// <param name="propertyName">属性名称</param>
/// <param name="sValue">字符类型的数值</param>
private void SetPropertyValue(object obj, string propertyName, string sValue)
{
PropertyInfo p = obj.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (p != null)
{
object dynmicValue;
if (p.PropertyType.IsArray)//数组类型,单独处理
{
p.SetValue(obj, sValue, null);
}
else
{
//根据属性类型动态转换属性的值
if (String.IsNullOrEmpty(sValue.ToString()))//空值
dynmicValue = p.PropertyType.IsValueType ? Activator.CreateInstance(p.PropertyType) : null;//值类型
else
dynmicValue = System.ComponentModel.TypeDescriptor.GetConverter(p.PropertyType).ConvertFromString(sValue.ToString());//创建对象
//调用属性的SetValue方法赋值
p.SetValue(obj, dynmicValue, null);
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:23404761
参考文档:
通过反射技术创建窗体实例然后给控件赋值(C#)
C#.NET给DataTable日期类型的列赋值报错:所需类型是 MySqlDateTime,值类型与列类型不匹配
ASP.NET通过HttpContext获取IP地址
C#.NET通过CodeDom.Compiler动态编译计算表达式的值
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
C/S架构软件开发平台旗舰版V6.0 | 使用FastReport.NET制作二维码报表|C/S开发框架
C#.NET7 VS2022 使用反射动态设置按钮Click事件
C# .NET 入门概念与知识点总结|C/S开发框架
C#/.NET 基础学习|C/S开发框架
百度地图API - 地址标注与位置显示(C#.NET)-C/S开发框架
C# .NET 6 新增的20个功能API,实例源码-C/S开发框架
C#.NET 6 实现全局异常处理-C/S开发框架
ASP.NET MVC快速入门(一)-C/S开发框架
C#.NET理解Task和async await原理-C/S开发框架
基于集团组织架构数据权限系统快速开发框架(C#.NET Winform+支持多数据库)
通过反射技术创建窗体实例然后给控件赋值(C#)
C#.NET给DataTable日期类型的列赋值报错:所需类型是 MySqlDateTime,值类型与列类型不匹配
ASP.NET通过HttpContext获取IP地址
C#.NET通过CodeDom.Compiler动态编译计算表达式的值
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
C/S架构软件开发平台旗舰版V6.0 | 使用FastReport.NET制作二维码报表|C/S开发框架
C#.NET7 VS2022 使用反射动态设置按钮Click事件
C# .NET 入门概念与知识点总结|C/S开发框架
C#/.NET 基础学习|C/S开发框架
百度地图API - 地址标注与位置显示(C#.NET)-C/S开发框架
C# .NET 6 新增的20个功能API,实例源码-C/S开发框架
C#.NET 6 实现全局异常处理-C/S开发框架
ASP.NET MVC快速入门(一)-C/S开发框架
C#.NET理解Task和async await原理-C/S开发框架
基于集团组织架构数据权限系统快速开发框架(C#.NET Winform+支持多数据库)
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
