c#的泛型学习

也是莫名其妙的,之前学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();
        }

 

转载于:https://www.cnblogs.com/MrTuan/p/8406051.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值