解决夸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();
解决夸dll返回dynamic无法访问的更多相关文章
- Dll中的方法向外返回dynamic类型可能会失败
如果Dll中有某个类的方法返回dynamic实例,并且dynamic对象实际实例为匿名类类型,则Dll的外部使用者可能最终无法正常使用此dynamic对象.当使用此dynamic对象时,可能会遇到x属 ...
- 匿名类型 使用泛型T linq返回dynamic类型的匿名实体 如何把匿名类型.GetType()返回的对象传进泛型里面 EF实体查询出的数据List<T>转DataTable出现【DataSet 不支持 System.Nullable<>】的问题
[100分]紧急求助:LinQ下使用IQueryable<T>如何将返回类型<T>使用匿名类型 问题描述如下:我有一个方法如下:public IQueryable Dissen ...
- 解决mysql中只能通过localhost访问不能通过ip访问的问题
解决mysql中只能通过localhost访问不能通过ip访问的问题 原因是没开权限 SELECT * FROM USER WHERE USER='root'; grant all privilege ...
- 解决@ResponseBody注解返回的json中文乱码问题
1. 简介 主要解决@ResponseBody注解返回的json中文乱码问题. 2.解决方案 2.1mvc加上注解(推荐此方法) 在mvc配置文件中假如下面配置(写在 <mvc:annotati ...
- 如何解决http请求返回结果中文乱码
如何解决http请求返回结果中文乱码 1.问题描述 http请求中,请求的结果集中包含中文,最终以乱码展示. 2.问题的本质 乱码的本质是服务端返回的字符集编码与客户端的编码方式不一致. 场景的如服务 ...
- EF 6.x和EF Core实现返回dynamic类型
前言 未曾想需要直接返回dynamic,多次尝试未能实现,最终还是在stackoverflow上找到了解决方案,特此备忘录. public static dynamic SqlQuery(this D ...
- 解决nginx发布网站跨目录访问
解决nginx发布网站跨目录访问(thinkphp5+lnmp) 到:usr/local/nginx/conf/vim fastcgi.cof 把最后一行加上井号#注释掉保存重启 restart 参考 ...
- 解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件
本文图文讲解如何解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件. 默认打开IDEA的Plugins会加载很久,最后什么也没加载出来. 这时我们可以给插件市场设置 ...
- 解决 对路径bin\roslyn..的访问被拒绝
使用visual studio开发,一重新编译就会报错: 对路径“bin\roslyn\System.Reflection.Metadata.dll”的访问被拒绝 一开始的解决办法就是把bin下的文件 ...
随机推荐
- Cocos2d-x 多点触摸
多点触摸的实现步骤与单点触摸类似,setTouchEnabled(true)开启触摸功能,注冊触摸事件,重载多点触摸函数:ccTouchesBegan(開始).ccTouchesMoved(移动).c ...
- 箭头函数普通函数this
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php设计模式之桥接模式
php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...
- 移动端1px细线问题
1可以用伪类实现 .con{position: relative;.con:before { content: " "; position: absolute; left: 0; ...
- MapReduce 程序:WordCount
- split(":")[0].substring(1)
java中拆分字符中的split(":")[0].substring(1)是什么意思啊,尤其[0] 可以解释一下吗?:比如你有一个字符串 "111:222:333&quo ...
- gin golang xorm
https://blog.csdn.net/keytounix/article/details/79337587
- cuda windows运行时间限制
GTX1080的卡,8G的显存,写cuda时申请了2G的显存就莫名其妙的抛异常,昨天找了一天也没找出bug,去stackoverflow上问了下才知道是windows的事,需要修改注册表.问题链接 - ...
- 在javascript中对于this指向的再次理解
总所周知,function () {}函数体内的this对象指向的是调用该函数的对象,那么我们看一下这个例子 <script> var length = 3; function fn () ...
- 斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌
大学期间,我在别人的基础上,写了一个简易的斗地主程序. 主要实现了面向对象设计,洗牌.发牌.判断牌型.比较牌的大小.游戏规则等算法. 通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算 ...