你好,游客 登录 注册 搜索
背景:
阅读新闻

DotNet反射赋值出现的问题 - 三人行必有我师,手写三行必有所悟

[日期:2013-03-22] 来源:  作者: [字体: ]

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





收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻