DotNet反射赋值出现的问题.docxVIP

  • 3
  • 0
  • 约小于1千字
  • 约 1页
  • 2022-06-20 发布于上海
  • 举报
DotNet 反射赋值出现的问题 最近在做测试自己写的分布式 ORM 时,发现进行数据集到实体集合转换时,600 条不到居然转换了十多秒,其实做这种转换做过多次,从来没有出现这种情况,于是进行调试后发现,影响速度的主要是转换时发生异常非常频繁,系统在不断的进行异常处理(因为转换中可能出错, 但不会影响结果,我屏蔽了异常).再对比我原来写的转换代码发现,由于很久没写这种代码,这次写的时候少了空值和类型转换,直接写了如下语句: PropertyInfo.SetValue(obj, Value, null); //PropertyInfo 未反射获取的属性信息. 因为 Value 可能为空,为空就会报异常.系统因为要处理异常就会变得很慢,这也是 500 条记录转换成实体居然要十多秒的原因所在.看原来的代码,并参照同事的建议改写成如下: [csharp] view plaincopyprint? if (PropertyInfo != null) { if (PropertyInfo.CanWrite) { strongif (Value != null Value != DBNull.Value) { PropertyInfo.SetValue(obj, PropertyInfo.PropertyType), null); } else { Convert.ChangeType(Value, if (!PropertyInfo.PropertyType.IsValueType) { PropertyInfo.SetValue(obj, null, null); } }/strong } } 上面代码中,对于非值类型(引用类型),赋空值在纯粹的行记录到实体对象的转换时是没有必要的,但这个函数也可以用于适用名称赋值,所以我增加了该功能.经过修改后,600 条记录的转换就正常了,速度还可以.其实原来做ORM时也写过,对空值都做了处理,这次写的时候无意识中进行了想当然的简化,造成了转换慢的问题.看来有些细节问题,很久没关注就会忘掉.所以这次写下来,争取下次写的时候别出错, PS:该赋值方法照样不适用集合类型的赋值,但一般 ORM 时都不会有这个问题,所以没有去做适应集合赋值的功能。

文档评论(0)

1亿VIP精品文档

相关文档