zoukankan      html  css  js  c++  java
  • 解决夸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();
  • 相关阅读:
    tortoisegit 还原到某个版本
    AndroidStudio2021/3版 gradle7.0环境 自定义输出apk路径
    docker镜像打包save,载入load,启动run
    Failed to execute goal com.spotify:docker-maven-plugin:0.4.13:build (default-cli)
    windows10下载网址
    win10开启CPU虚拟化导致蓝屏信息
    swagger-ui.html
    git初始化
    node-sass 把变量导出给js共享。
    openlayers moveend getEventCoordinate
  • 原文地址:https://www.cnblogs.com/randyzhuwei/p/4058826.html
Copyright © 2011-2022 走看看