DotNet反射赋值出现的问题
来源:互联网 发布:sql中多个case when 编辑:程序博客网 时间:2024/06/05 14:16
最近在做测试自己写的分布式ORM时,发现进行数据集到实体集合转换时,600条不到居然转换了十多秒,其实做这种转换做过多次,从来没有出现这种情况,于是进行调试后发现,影响速度的主要是转换时发生异常非常频繁,系统在不断的进行异常处理(因为转换中可能出错,但不会影响结果,我屏蔽了异常).再对比我原来写的转换代码发现,由于很久没写这种代码,这次写的时候少了空值和类型转换,直接写了如下语句:
PropertyInfo.SetValue(obj, Value, null); //PropertyInfo未反射获取的属性信息.
因为Value可能为空,为空就会报异常.系统因为要处理异常就会变得很慢,这也是500条记录转换成实体居然要十多秒的原因所在.看原来的代码,并参照同事的建议改写成如下:
if (PropertyInfo != null) { if (PropertyInfo.CanWrite) { if (Value != null && Value != DBNull.Value) { PropertyInfo.SetValue(obj, Convert.ChangeType(Value, PropertyInfo.PropertyType), null); } else { if (!PropertyInfo.PropertyType.IsValueType) { PropertyInfo.SetValue(obj, null, null); } } } }
上面代码中,对于非值类型(引用类型),赋空值在纯粹的行记录到实体对象的转换时是没有必要的,但这个函数也可以用于适用名称赋值,所以我增加了该功能.经过修改后,600条记录的转换就正常了,速度还可以.其实原来做ORM时也写过,对空值都做了处理,这次写的时候无意识中进行了想当然的简化,造成了转换慢的问题.看来有些细节问题,很久没关注就会忘掉.所以这次写下来,争取下次写的时候别出错,
PS:该赋值方法照样不适用集合类型的赋值,但一般ORM时都不会有这个问题,所以没有去做适应集合赋值的功能。
- DotNet反射赋值出现的问题
- 关于赋值表达式中出现 "/" 的问题
- 反射 实体类的赋值/取值问题
- 使用dotnet时出现的若干问题
- dotNet C# 下的全局钩子问题
- asp.net高级反射,动态生成的bean如何处理赋值问题?
- C# 反射给对象赋值遇到的问题——类型转换
- 关于在Java使用反射对属性取值和赋值的性能问题。
- C# 反射给对象属性赋值遇到的问题——类型转换
- 用反射解决 MVC4 非自增主键赋值后 无法保存的问题
- 反射给对象赋值遇到的问题——类型转换
- 利用“反射”给类的属性赋值。
- 利用反射实现JavaBean的自动赋值
- DotNet 项目中App.config出现的编译错误
- 指针的赋值问题
- 指针赋值的问题
- 指针赋值的问题
- WriteableBitmap的赋值问题
- MyEclipse连接MySQL的方法
- Uva-10891-Game of Sum
- mysql命令行修改字符编码
- android的几种动画
- 关于编译错误:"_OBJC_CLASS_$_XXXXXX", referenced from:
- DotNet反射赋值出现的问题
- cout double 精度问题
- 人民币与美元转换
- java比较器(1)
- Boost 智能指针错误shared_ptr Assertion px != 0 failed
- 关于网站备案相关流程
- 第三次课堂作业
- xcode 静态库资源文件及xib封装
- asp.net 面试题目