解决夸dll返回dynamic无法访问

 public static class DynamicFactory
    {
        //创建线程安全(对象不会再同一时刻被多个线程访问)的字典对象
        private static ConcurrentDictionary<Type, Type> s_dynamicTypes = new ConcurrentDictionary<Type, Type>();
        private static Func<Type, Type> s_dynamicTypeCreator = new Func<Type, Type>(CreateDynamicType);
        /// <summary>
        /// 创建object的扩展方法用来扩展匿名对象
        /// </summary>
        public static object ToPublic(this object entity)
        {
            try
            {
                var entityType = entity.GetType();
                var dynamicType = s_dynamicTypes.GetOrAdd(entityType, s_dynamicTypeCreator);

                var dynamicObject = Activator.CreateInstance(dynamicType);
                foreach (var entityProperty in entityType.GetProperties())
                {
                    var value = entityProperty.GetValue(entity, null);
                    //重新给传递过来的匿名类赋值
                    dynamicType.GetField(entityProperty.Name).SetValue(dynamicObject, value);
                }

                return dynamicObject;
            }
            catch (Exception ex)
            {
                Common.WriteLog("ToPublic", ex.ToString());
                return null;
            }
        }

        private static Type CreateDynamicType(Type entityType)
        {
            //创建程序集名称
            try
            {
                var asmName = new AssemblyName("DynamicAssembly_" + Guid.NewGuid());
                //定义程序集
                var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
                //在程序集中定义模块
                var moduleBuilder = asmBuilder.DefineDynamicModule("DynamicModule_" + Guid.NewGuid());
                //将传递过来的匿名类型名称重新命名并设置到新的模块程序集中
                var typeBuilder = moduleBuilder.DefineType(
                    entityType.GetType() + "$DynamicType",
                    TypeAttributes.Public);
                //定义该类的构造函数
                typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
                //循环匿名类中所有字段
                foreach (var entityProperty in entityType.GetProperties())
                {
                    //将匿名类的字段重新定义到当前自定义的程序集中
                    typeBuilder.DefineField(entityProperty.Name, entityProperty.PropertyType, FieldAttributes.Public);
                }
                //创建自定义程序集
                return typeBuilder.CreateType();
            }
            catch (Exception ex)
            {
                Common.WriteLog("ToPublic", ex.ToString());
                return null;
            }
        }
    }
//用法
 dynamic excelData = new
                {
                    str_Title = "获取标题",
                    str_Code = "获取标题",   
            dt_SheetTable = datatable
                }.ToPublic();

 

posted @ 2014-10-29 10:32  zhuweirandy  阅读(268)  评论(0编辑  收藏  举报