zoukankan      html  css  js  c++  java
  • 动态填写实体类的值

    /// <summary>
        /// 动态填写实体类的值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class DynamicEntityBuilder<T>
        {
            private static readonly MethodInfo getValueMethod = typeof(IDataRecord).GetMethod("get_Item", new Type[] { typeof(int) });
            private static readonly MethodInfo isDBNullMethod = typeof(IDataRecord).GetMethod("IsDBNull", new Type[] { typeof(int) });
            private delegate T Load(IDataRecord dataRecord);
            private Load handler;
    
            private DynamicEntityBuilder() { }
    
            public T Build(IDataRecord dataRecord)
            {
                return handler(dataRecord);
            }
    
            public static DynamicEntityBuilder<T> CreateBuilder(IDataRecord dataRecord)
            {
                DynamicEntityBuilder<T> dynamicBuilder = new DynamicEntityBuilder<T>();
    
                DynamicMethod method = new DynamicMethod("DynamicCreate", typeof(T), new Type[] { typeof(IDataRecord) }, typeof(T), true);
                ILGenerator generator = method.GetILGenerator();
    
                LocalBuilder result = generator.DeclareLocal(typeof(T));
                generator.Emit(OpCodes.Newobj, typeof(T).GetConstructor(Type.EmptyTypes));
                generator.Emit(OpCodes.Stloc, result);
    
                for (int i = 0; i < dataRecord.FieldCount; i++)
                {
                    PropertyInfo propertyInfo = typeof(T).GetProperty(dataRecord.GetName(i));
                    Label endIfLabel = generator.DefineLabel();
    
                    if (propertyInfo != null && propertyInfo.GetSetMethod() != null)
                    {
                        generator.Emit(OpCodes.Ldarg_0);
                        generator.Emit(OpCodes.Ldc_I4, i);
                        generator.Emit(OpCodes.Callvirt, isDBNullMethod);
                        generator.Emit(OpCodes.Brtrue, endIfLabel);
    
                        generator.Emit(OpCodes.Ldloc, result);
                        generator.Emit(OpCodes.Ldarg_0);
                        generator.Emit(OpCodes.Ldc_I4, i);
                        generator.Emit(OpCodes.Callvirt, getValueMethod);
                        generator.Emit(OpCodes.Unbox_Any, dataRecord.GetFieldType(i));
                        generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod());
    
                        generator.MarkLabel(endIfLabel);
                    }
                }
    
                generator.Emit(OpCodes.Ldloc, result);
                generator.Emit(OpCodes.Ret);
    
                dynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load));
                return dynamicBuilder;
            }
        }

    使用

     public ERole Select(int roleID)
            {
                ERole entity = new ERole();
                string sql = string.Format("select * from Role with(nolock) where roleid = {0}",roleID);
                DbCommand cmd = Db.EsfCrmReader.GetSqlStringCommand(sql);         
              
                using (IDataReader dataReader = Db.EsfCrmReader.ExecuteReader(cmd))
                {
                    if (dataReader.Read())
                    {  
                        entity = DynamicEntityBuilder<ERole>.CreateBuilder(dataReader).Build(dataReader);  
                    }
                }
                return entity;
            }
  • 相关阅读:
    git
    centos7安装python3和ipython
    centos7 安装mysql5.7
    ceph-文件存储
    ceph-对象存储
    ceph-块存储客户端
    ceph-简介及安装(luminous)版
    centos7 kvm安装使用
    webpack多页面应用打包问题-新增页面打包JS影响旧有JS资源
    webpack4.0 babel配置遇到的问题
  • 原文地址:https://www.cnblogs.com/zhangji/p/3596461.html
Copyright © 2011-2022 走看看