解决夸dll返回dynamic无法访问
阅读原文时间:2023年07月14日阅读:3

public static class DynamicFactory
{
//创建线程安全(对象不会再同一时刻被多个线程访问)的字典对象
private static ConcurrentDictionary s_dynamicTypes = new ConcurrentDictionary();
private static Func s_dynamicTypeCreator = new Func(CreateDynamicType);
///

/// 创建object的扩展方法用来扩展匿名对象 ///
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();