博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 反射给对象赋值遇到的问题——类型转换
阅读量:6125 次
发布时间:2019-06-21

本文共 1673 字,大约阅读时间需要 5 分钟。

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

给一个对象属性赋值可以通过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获取属性数组,循环进行赋值,这里主要讲解类型问题。

赋值可通过方法,详见MSDN。

 

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

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

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

 

情况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
);
                
}
            
}

转载于:https://www.cnblogs.com/liujianshe1990-/p/7690580.html

你可能感兴趣的文章
Android横屏竖屏设置
查看>>
详解MySQL---DDL语句、DML语句与DCL语句
查看>>
dubbo简述
查看>>
<a href="javascript:void(0)" onclick="ff()" ></a> 用法解析
查看>>
Android 使用CheckBox实现多选效果
查看>>
Redis-stat的安装与使用
查看>>
UX结合需求实例化进行设计开发
查看>>
android第一行代码-2.activity基本用法
查看>>
VC Windows API获得桌面所有窗口句柄的方法
查看>>
UIBezierPath
查看>>
should be mapped with insert="false" update="false
查看>>
elixir 高可用系列(五) Supervisor
查看>>
李洪强-C语言关键字、标识符和注释
查看>>
单向和双向tvs管
查看>>
JS监听回车事件
查看>>
懒加载 与 富文本编辑器 的 相爱相杀
查看>>
模拟登陆并且登陆封装工具类
查看>>
[Nginx] - PHP+FPM相关的配置
查看>>
SQL转Java代码小工具
查看>>
Android Studio安装后第一次进不去
查看>>