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时都不会有这个问题,所以没有去做适应集合赋值的功能。

原创粉丝点击