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();
  • 相关阅读:
    HDU
    UVa——540Team Queue(STL练习map、queue数组的综合使用)
    NOJ——1659求值(log10取对数+floor取整数部分+可有可无的快速幂)
    NOJ——1658平方和(自然数平方和公式和取模法则)
    HDU——2723Electronic Document Security(STL map嵌套set做法)
    HDU——1982Kaitou Kid
    HDU——1073Online Judge(string类以及其对应函数)
    HDU——1062Text Reverse(水题string::find系列+reverse)
    HDU——1009FatMouse' Trade(贪心+结构体+排序)
    HDU——1799循环多少次(杨辉三角/动态规划/C(m,n)组合数)
  • 原文地址:https://www.cnblogs.com/randyzhuwei/p/4058826.html
Copyright © 2011-2022 走看看