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();

解决夸dll返回dynamic无法访问的更多相关文章

  1. Dll中的方法向外返回dynamic类型可能会失败

    如果Dll中有某个类的方法返回dynamic实例,并且dynamic对象实际实例为匿名类类型,则Dll的外部使用者可能最终无法正常使用此dynamic对象.当使用此dynamic对象时,可能会遇到x属 ...

  2. 匿名类型 使用泛型T linq返回dynamic类型的匿名实体 如何把匿名类型.GetType()返回的对象传进泛型里面 EF实体查询出的数据List<T>转DataTable出现【DataSet 不支持 System.Nullable<>】的问题

    [100分]紧急求助:LinQ下使用IQueryable<T>如何将返回类型<T>使用匿名类型 问题描述如下:我有一个方法如下:public IQueryable Dissen ...

  3. 解决mysql中只能通过localhost访问不能通过ip访问的问题

    解决mysql中只能通过localhost访问不能通过ip访问的问题 原因是没开权限 SELECT * FROM USER WHERE USER='root'; grant all privilege ...

  4. 解决@ResponseBody注解返回的json中文乱码问题

    1. 简介 主要解决@ResponseBody注解返回的json中文乱码问题. 2.解决方案 2.1mvc加上注解(推荐此方法) 在mvc配置文件中假如下面配置(写在 <mvc:annotati ...

  5. 如何解决http请求返回结果中文乱码

    如何解决http请求返回结果中文乱码 1.问题描述 http请求中,请求的结果集中包含中文,最终以乱码展示. 2.问题的本质 乱码的本质是服务端返回的字符集编码与客户端的编码方式不一致. 场景的如服务 ...

  6. EF 6.x和EF Core实现返回dynamic类型

    前言 未曾想需要直接返回dynamic,多次尝试未能实现,最终还是在stackoverflow上找到了解决方案,特此备忘录. public static dynamic SqlQuery(this D ...

  7. 解决nginx发布网站跨目录访问

    解决nginx发布网站跨目录访问(thinkphp5+lnmp) 到:usr/local/nginx/conf/vim fastcgi.cof 把最后一行加上井号#注释掉保存重启 restart 参考 ...

  8. 解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

    本文图文讲解如何解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件. 默认打开IDEA的Plugins会加载很久,最后什么也没加载出来. 这时我们可以给插件市场设置 ...

  9. 解决 对路径bin\roslyn..的访问被拒绝

    使用visual studio开发,一重新编译就会报错: 对路径“bin\roslyn\System.Reflection.Metadata.dll”的访问被拒绝 一开始的解决办法就是把bin下的文件 ...

随机推荐

  1. UnrealEngine4初始化流程

    自古以来全部的游戏引擎都分为三个大阶段:Init,Loop,Exit.UE4也不例外. 首先找到带有入口函数的文件:Runtime/Launch/Private/XXXX/LaunchXXXX.cpp ...

  2. Unique path ii

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  3. m_Orchestrate learning system---五、学的越多,做的越快

    m_Orchestrate learning system---五.学的越多,做的越快 一.总结 一句话总结: 1.上传的图像文件用input('post.')方法取不到是为什么? 图片不来就这样取不 ...

  4. BZOJ 4260 trie树

    思路: 搞一个前缀异或和 一次从左往右 另一次从右往左 异或最大值 用字典树搞一搞 //By SiriusRen #include <cstdio> #include <cstrin ...

  5. ActiveMQ学习笔记(6)----ActiveMQ整合Spring开发

    1. 添加依赖 spring 提供了对JMS的支持,需要添加Spring支持jms的包和Spring的核心包,如下: <dependency> <groupId>org.apa ...

  6. 关于RoI pooling 层

    ROIs Pooling顾名思义,是pooling层的一种,而且是针对ROIs的pooling: 整个 ROI 的过程,就是将这些 proposal 抠出来的过程,得到大小统一的 feature ma ...

  7. nginx 子进程 woker process 启动失败的问题

    问题: 重启nginx服务,worker process 子进程启动失败,启动的都是master进程: 负载急速升高(平常都是4-5),占用CPU资源多的前十进程都是nginx : nginx 错误日 ...

  8. js的onclick和jq的click以及on和bind的区别

    onclick和click,只能静态绑定点击事件:bind的可以一次绑定多个事件(click/onmouseover等):on可以动态的绑定事件,当页面加载完成调用on即可

  9. 【BZOJ4444】国旗计划 - 决策单调性

    Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边 ...

  10. Vue export和import

    config/index.js export default '123456'; import strs from '@/config';   //此处直接写@config就可以, 如果是export ...