也是莫名其妙的,之前学ABP框架的时候,突然就想编一个通用的数据库访问类库,因此就详细了解了一下泛型的实用等等的。(所以ABP就暂时放在那先啦)
一开始自以为是个高大上的东西,好厉害的感觉。。。(那一刻感觉自己好NB,自恋啊。。)
然后花了几天,编好以后发现。。。果然还是Low的,以下呢,就是最近的核心东西啦
//创建泛型类 public class Select<T> { private T Entity; public Select() { Type type = typeof(T); T _Entity = (T)type.Assembly.CreateInstance(type.FullName); Entity=_Entity; } //接下来就是一堆关于数据库的操作啦 } //调用 public class index :System.Web.UI.Page { protected void Page_Load(object sender ,EventArgs e) { //model是实体类 Select<model> selectModel=new Select<model>(); //接下来就是调用select的方法啦 } }
嗯嗯,这个呢就是主要的东西,其他东西都是机械式的,就不写啦。
放在这主要是希望有哪个大佬能指导以下,看看这个类库还有哪里能改进的。。。
当然啦,如果有人对这个感兴趣也可以留言邮箱哦,我发过去。。
最主要的是想有个人帮忙看看哪里还能改进
2018-2-3:查阅发现,通过反射机制创建实体的话。。整体性能会差。。瞬间就不知道该不该做这个东西了。。。
2018-2-4:主要修改了大部分多余的代码,同时尽量的减少反射,用dictionary来缓存类型以及类型属性来提升这个类库的性能。。不知道这样会不会太消耗内存。。
2018-2-7:学习了一个方法,用委托的形式来优化反射创建对象,尽量的提升性能
Entity = (T)Activator.CreateInstance(typeof(T)); Type type = typeof(T); MethodInfo mcMi = type.GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance);
//因为Func<object, object>直接调用的就是MemberwiseClone这个方法,所以效率会提升,数据量较大时,可以提升10倍左右(网上找的= =)
Func<object, object> mcAct = Delegate.CreateDelegate(typeof(Func<object, object>), mcMi) as Func<object, object>; for(int i=0;i<=100;i++) { Entity = (T)mcAct(Entity); }
2018-2-8:尽量的寻找的批量创建泛型对象的优化方法。。但是依然是上面的这个消耗更少。另外发现用泛型new约束后,批量创建的时间和用反射批量创建所消耗的时间基本一致。。所以就想着,泛型new约束是不是就是利用反射来创建一个泛型对象
2018-2-12:找到了一个最接近直接new对象的一个方法,叫“IL创建泛型对象”!!参考:这位
public static Func<T> objCreator = null; public static T New() { if (objCreator == null) { Type objectType = typeof(T); ConstructorInfo defaultCtor = objectType.GetConstructor(new Type[] { }); DynamicMethod dynMethod = new DynamicMethod( name: string.Format("_{0:N}", Guid.NewGuid()), returnType: objectType, parameterTypes: null); var gen = dynMethod.GetILGenerator(); gen.Emit(OpCodes.Newobj, defaultCtor); gen.Emit(OpCodes.Ret); objCreator = dynMethod.CreateDelegate(typeof(Func<T>)) as Func<T>; } return objCreator(); }