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里面的属性赋值。
请问下路过的朋友这段代码还可以怎么优化下执行效率更快?
反射的优化通常是第二次,也就是说第一次将属性缓存,第二次就快了。
其实我的反射是在循环外面进行的, PropertyInfo[] propertyInfos = typeof(Entity).GetProperties();
上面的代码是对属性的一个赋值。 你觉得复制的这个字符串对比还有赋值SetValue会导致过慢吗?
@Vincent_void:
有关反射优化的文章,建议你看下fishli写过的几篇文章,应该会对你有帮助的。
fish你不知道是谁?那你知道12306吗?
@爱编程的大叔: 呵呵,谢谢你。我懂了。
@爱编程的大叔: 请问爱编程的大叔,fishli在12306做什么?呵呵
@Vincent_void:
12306的外协程序员...据说第一个抢票插件他开发的...
不用这样判断吧,我记得直接 setvalue就行了.
反射优化在园子里找下文章有很多的,几句话说不完的
能的。你的这个类型判断太复杂了。请参考如下代码:
Type propertyPype = property.PropertyType; property.SetValue(this, Convert.ChangeType(value, propertyPype), null);
如果是 string 转换为 int? 类型就会有这个问题。
System.InvalidCastException: 从“System.String”到“System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”的强制转换无效。
不好处理,这个未知的类型,因为是动态的。
@Vincent_void: 判断下,如果propertyPype是可控的,用对应的简单类型。
反射的性能优化,一般来说就是缓存。
@幻天芒: 对不起啊,我不知道我说的对不对。
PropertyInfo[] propertyInfos = typeof(Entity).GetProperties(); 反射我是循环外面只执行了一次。
而SetValue的部分是使用最多的,这块应该用不上缓存了吧?
@Vincent_void: 那这样基本上已经够了。
emit。