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

摘要:
创建实例时,现在可以为当前实例的属性赋值,并首先获得要赋值的属性。情况2,属性类型是已知的,原始值是其他类型。例如,目标类型为int,值为string12stringvalue=“500”;所有物设置值;//类型转换。前两种情况非常简单。有时业务更复杂,目标类型不确定,这需要程序运行时的判断。即使目标类型和值类型相同,使用Convert-ChangeType()仍会在转换过程中报告错误。要解决此问题,请先将属性值类型转换为基类型,然后进行转换。

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

给一个对象属性赋值可以通过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()方法,类型转换仍然报错,先看下面的代码。

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

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

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

这样,在使用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);
                }
            }

免责声明:文章转载自《C# 反射给对象赋值遇到的问题——类型转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IDEA的基本使用技巧进程管理02 通过PEB枚举进程所有模块下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++语言体系设计哲学的一些随想(未完待续)

对于静态类型语言,其本质目标在于恰当地操作数据,得到期望的值。具体而言,需要: (1)定义数据类型 你定义的数据是什么,是整形还是浮点还是字符。该类型的数据可以包含的值的范围是什么。 (2)定义操作的含义 操作是严格数据类型相关的。操作表明了对了一个具有特定类型的数据,执行操作后产生什么样结果。  =============================...

学习笔记之C# 教程 | 菜鸟教程

C# 教程 | 菜鸟教程 http://www.runoob.com/csharp/csharp-tutorial.html 菜鸟教程在线编辑器 http://www.runoob.com/try/runcode.php?filename=HelloWorld&type=cs C# Programming Guide - 介绍了有关关键的 C#...

在MongoDB中修改数据类型

引言 本文主要讲解Mongodb的类型转换。包括:string转double, string转int, string转Date。 0. 出现类型不一致的原因 ES导入数据到Mongo后,会出现类型统一改为String的问题。 传统关系型数据库,在设计表处,右键就可以完成修改表类型。 但是非关系型数据库,没有这种实现。只有通过命令行操作实现。 验证表明,可以...

JS数据类型转换

JS数据类型转换方法主要有三种:转换函数、强制类型转换、利用js变量弱类型转换。 1、转换函数: js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。  在判断字符串是事是数字值前,...

SQL 增、删、改、查、数据处理、类型转换(一)

1.添加数据(行受影响)     第一种 insert into 表名(列名,列名) values(值1,值2) insert into Student(StuName,StuGender) values('小明','男');     第二种 insert into MyClass values('值一','值二') insert into MyClass...

C++开发必看 四种强制类型转换的总结 [转]

         一、C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:        TYPE b = (TYPE)a   二、C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。   const_cast,字面上理解就是去const属性。   static_cast,命名上理解是静态类型转换。如int转换成ch...