DotNet反射赋值出现的问题

最近在做测试自己写的分布式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时都不会有这个问题,所以没有去做适应集合赋值的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值