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;
            }
  • 相关阅读:
    Django 06模板语言的复用
    Django 07模型层—单表操作
    Django 05模板-变量、过滤器、 标签
    Django 04(视图层基础01)
    Django 03 (路由层基础)
    Django--02(项目创建,数据请求迁移,单表orm增删改查)
    Web 文本、reset操作、高级选择器、边界圆角、a的四大伪类、精灵图
    web前端 基础选择器、长度与颜色、display、嵌套、盒模型
    MySQL之数据库的常用语句
    PHP中级篇 Apache配置httpd-vhosts虚拟主机总结及注意事项(转载)
  • 原文地址:https://www.cnblogs.com/zhangji/p/3596461.html
Copyright © 2011-2022 走看看