首页 新闻 赞助 找找看

里面的.NET 代码还能调优吗?

0
悬赏园豆:10 [已解决问题] 解决于 2014-08-14 11:52
 protected T setPropertyInfo<T>(T pEntity, Data pDefiendData, PropertyInfo[] pis)
        {
            T entity = pEntity;
            T t = Activator.CreateInstance<T>();
            foreach (PropertyInfo pi in pis)
            {
                var attr = pi.Name.ToLower(); //得到属性的名称

                if (attr == pDefiendData.ColumnName.ToLower())
                {
                    if (pi.PropertyType.ToString().ToLower().IndexOf("int32") >= 0 && !string.IsNullOrEmpty(pDefiendData.Value))
                    {
                        pi.SetValue(entity, int.Parse(pDefiendData.Value), null);
                    }
                    else if (pi.PropertyType.ToString().ToLower().IndexOf("double") >= 0 && !string.IsNullOrEmpty(pDefiendData.Value))
                    {
                        pi.SetValue(entity, double.Parse(pDefiendData.Value), null);
                    }
                    else if (pi.PropertyType.ToString().ToLower().IndexOf("single") >= 0 && !string.IsNullOrEmpty(pDefiendData.Value))
                    {
                        pi.SetValue(entity, float.Parse(pDefiendData.Value), null);
                    }
                    else if (pi.PropertyType.ToString().ToLower().IndexOf("boolean") >= 0 && !string.IsNullOrEmpty(pDefiendData.Value))
                    {
                        pi.SetValue(entity, double.Parse(pDefiendData.Value), null);
                    }
                    else if (pi.PropertyType.ToString().ToLower().IndexOf("decimal") >= 0 && !string.IsNullOrEmpty(pDefiendData.Value))
                    {
                        pi.SetValue(entity, decimal.Parse(pDefiendData.Value), null);
                    }
                    else if (pi.PropertyType.ToString().ToLower().IndexOf("datetime") >= 0 && !string.IsNullOrEmpty(pDefiendData.Value))
                    {
                        pi.SetValue(entity, DateTime.Parse(pDefiendData.Value), null);
                    }
                    else if (pi.PropertyType.ToString().ToLower().IndexOf("string") >= 0)
                    {
                        pi.SetValue(entity, pDefiendData.Value, null);
                    }
                    else if (pi.PropertyType.ToString().ToLower().IndexOf("guid") >= 0 && !string.IsNullOrEmpty(pDefiendData.Value))
                    {
                        pi.SetValue(entity, Guid.Parse(pDefiendData.Value), null);
                    }
                    break;
                }
            }
            return entity;
        }

这是一个反射的代码,传一个实体,和该实体类的 属性结合。根据 

pDefiendData对象的Value对entity里面的属性赋值。 

请问下路过的朋友这段代码还可以怎么优化下执行效率更快?

Vincent_void的主页 Vincent_void | 菜鸟二级 | 园豆:238
提问于:2014-07-10 10:17
< >
分享
最佳答案
0

反射的优化通常是第二次,也就是说第一次将属性缓存,第二次就快了。

收获园豆:3
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-07-10 10:30

其实我的反射是在循环外面进行的,   PropertyInfo[] propertyInfos = typeof(Entity).GetProperties();

上面的代码是对属性的一个赋值。 你觉得复制的这个字符串对比还有赋值SetValue会导致过慢吗?

Vincent_void | 园豆:238 (菜鸟二级) | 2014-07-10 10:33

@Vincent_void: 

有关反射优化的文章,建议你看下fishli写过的几篇文章,应该会对你有帮助的。

fish你不知道是谁?那你知道12306吗?

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-07-10 11:23

@爱编程的大叔: 呵呵,谢谢你。我懂了。

Vincent_void | 园豆:238 (菜鸟二级) | 2014-07-10 11:26

@爱编程的大叔: 请问爱编程的大叔,fishli在12306做什么?呵呵

Vincent_void | 园豆:238 (菜鸟二级) | 2014-07-10 11:47

@Vincent_void: 

12306的外协程序员...据说第一个抢票插件他开发的...

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-07-10 11:51
其他回答(3)
0

不用这样判断吧,我记得直接 setvalue就行了.

反射优化在园子里找下文章有很多的,几句话说不完的

收获园豆:2
吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-10 11:01
0

能的。你的这个类型判断太复杂了。请参考如下代码:

Type propertyPype = property.PropertyType;
     property.SetValue(this, Convert.ChangeType(value, propertyPype), null);
收获园豆:3
幻天芒 | 园豆:37175 (高人七级) | 2014-07-10 13:04

如果是 string 转换为 int? 类型就会有这个问题。

System.InvalidCastException: 从“System.String”到“System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”的强制转换无效。

 

不好处理,这个未知的类型,因为是动态的。

支持(0) 反对(0) Vincent_void | 园豆:238 (菜鸟二级) | 2014-07-10 14:33

@Vincent_void: 判断下,如果propertyPype是可控的,用对应的简单类型。

反射的性能优化,一般来说就是缓存。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-07-10 14:42

@幻天芒: 对不起啊,我不知道我说的对不对。

 PropertyInfo[] propertyInfos = typeof(Entity).GetProperties(); 反射我是循环外面只执行了一次。

而SetValue的部分是使用最多的,这块应该用不上缓存了吧?

支持(0) 反对(0) Vincent_void | 园豆:238 (菜鸟二级) | 2014-07-10 14:55

@Vincent_void: 那这样基本上已经够了。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-07-10 15:17
0

emit。

forhells | 园豆:724 (小虾三级) | 2014-07-19 16:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册