通过.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





版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
发表评论

评论内容
昵称:
关联文章

通过.NET反射动态调用SetValue方法属性PropertyInfo赋值
通过反射技术创建窗体实例然后控件赋值(C#)
SetPropertyValue 对象的属性赋值
C# Winform动态设置控件的值及反射技术应用
C#.NET 定义动态对象dynamic以及属性方法
C#.NET扩展的动态对象支持动态属性方法以及Json格式与对象互转
C#.NET通过CodeDom.Compiler动态编译计算表达式的值
C# 动态编译及调用WebService的方法
C#.Net反射(Reflaction)技术实例详解
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
C# 绑定数据源的文本框.Text属性赋值,但没有保存数据
数据字典BLL.CreateDataBinder方法实现新增记录主键赋值
绑定数据源的文本输入框TextEdit.Text或EditValue属性赋值,失去焦点文本自动清空了
动态对象ExpandoObject实现动态函数调用
控件的属性是个类,如何添加自定义属性(C#)
通过反射,调用DLL程序集某个类的静态方法打开窗体
EditValueChanged事件,另外文本框赋值,为什么事件本身的值赋不值
C#.Net 类的同名方法重载调用顺序
C# DataGridView 自动新增记录当前单元格赋值
C#.NETDataTable日期类型的列赋值报错:所需类型是 MySqlDateTime,值类型与列类型不匹配