优化反射之开始
继上篇上篇的用Emit 代替直白反射或者是目的是优化反射,初步窥探了一下 Emit概貌,现在开始慢慢切入主题:
场景如下: 1.去数据库更新一个类,如果不是用的 EF等ORM 组件需要自己手动去修改一个类的改动字段,然后插入数据库。现在给出反射方法,Demo如下:
public static void RefSetValue<T>(T t1_entity, T t2_entity) where T : class, new() { //t2_entity 值赋值给 t1_entity var proinfo = t1_entity.GetType().GetProperties(); var temp_type = t2_entity.GetType(); proinfo.ToList().ForEach(p => { var value = p.GetValue(t1_entity, null); var value2 = temp_type.GetProperty(p.Name).GetValue(t2_entity, null); if (value2 != null && value != null) { if (!value.Equals(value2)) {
//可动态生成 sql 跟新字段 p.SetValue(t1_entity, value2, null); } } }); }
用法:
static void Main(string[] args) { var user = new Entity.UserBase(); user.Name = "user1"; var user2 = new Entity.UserBase(); user2.Name = "user2"; RefSetValue(user, user2); }
即可将需要更新的字段值赋予第一个类从而达到跟新实体修改过的字段。还可以动态拼接好 SQL 语句返回交给 DBHelper 执行。
PS:问题来了。我们需要优化性能,目前最多有几种方式 大概分为: 1.Emit 2.委托 3.动态编译
接下来的为大家逐个破解。敬请期待。