C# 反射给对象赋值遇到的问题——类型转换

转载 2013年01月23日 22:30:50

反射给对象赋值遇到的问题——类型转换

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

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

1.

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

2.

1
var obj = Activator.CreateInstance(ClassType);

以后有时间再把这两种的区别详细讲一下。


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

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

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


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

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

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


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

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


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


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

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


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


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


即使目标类型和值的类型是一致,通过Convert.ChangeType()进行转换仍然报错。
解决这个问题,就要先把属性值类型转成基类型后,在进行Convert转换。看代码


这样,在使用Convert.ChangeType()转换可空类型时,就不会报错了。
再增加一些基础的判断验证,代码就比较完善了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
                }
            }

反射可以通过FieldInfo.SetValue设置任何字段的值

http://www.cnblogs.com/Laser_Lu/archive/2004/08/01/29171.html反射可以通过FieldInfo.SetValue设置任何字段的值。 using...
  • hellowhy79
  • hellowhy79
  • 2006年11月02日 09:28
  • 3994

C#中的属性(get、set、value)

C#语言在面向对象设计和编程中对数据安全提出了严格的要求,其中一个重要的原则就是数据封装。根据这一原则,C#程序设计中要求开发人员对特定类的数据字段尽量不以公有方式提供给外界。因此在类内部多数字段的访...
  • wangshubo1989
  • wangshubo1989
  • 2015年08月21日 12:44
  • 6414

C#定义属性及其关键字get,set,value

Visual Studio 2010Visual Studio 2008Visual Studio 2005 C#定义属性: 属性拥有两个类似于函数的块,一个块用于获取属性的值,另...
  • linhong080324
  • linhong080324
  • 2013年06月28日 21:34
  • 1735

C#反射给字段赋值

obj,对象,fieldName,字段名,value,字段值 public void SetObjectValue(object obj,string fieldname,object value)...
  • superhoy
  • superhoy
  • 2012年12月05日 10:27
  • 2239

C#利用反射为属性赋值

作为一个普通程序员,相信每个人都曾经给某个model编写插入、修改方法时因为这个model的属性太多而吐槽过,当然聪明的使用例如动软代码生成器这样软件的你除外。这个时候我们一般是吐槽归吐槽,报怨归报怨...
  • yiyelanxin
  • yiyelanxin
  • 2017年08月03日 10:20
  • 476

[深入学习C#]利用反射给对象赋值

C#中利用反射能够获取对象的属性信息,也可以利用反射给对象赋值。   我们如果想利用凡是给一个对象属性赋值可以通过PropertyInfo.SetValue()方式进行赋值,但要注意值的类型要与属性...
  • honantic
  • honantic
  • 2015年09月07日 11:46
  • 20270

C# 反射给对象属性赋值遇到的问题——类型转换

点击打开链接 给一个对象属性赋值可以通过PropertyInfo.SetValue()方式进行赋值,但要注意值的类型要与属性保持一致。    创建对象实例的两种方法:  1. ...
  • whucv
  • whucv
  • 2014年12月25日 23:50
  • 2305

C#利用反射给实体属性赋值

//获取所有属性 private PropertyInfo[] GetPropertyInfoArray()         {             PropertyInfo[] props...
  • zhuyu19911016520
  • zhuyu19911016520
  • 2015年09月21日 13:57
  • 2018

C#利用反射简化给类字段赋值

说明:这个例子主要的思路是建立一个类和数据库查询语句的字段结构是一致的          然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值   1.类的定义 namespace...
  • limlimlim
  • limlimlim
  • 2012年12月05日 11:37
  • 7157

C# 可以利用反射给只读属性赋值吗?

结论:可以 验证demo如下: using System; using System.Collections.Generic; using System.ComponentModel; using S...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2015年05月06日 19:07
  • 2179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 反射给对象赋值遇到的问题——类型转换
举报原因:
原因补充:

(最多只允许输入30个字)