title author date CreateTime categories
dotnet 特性 DynamicallyInvokable 是用来做什么的
lindexi
2019-08-31 16:55:58 +0800
2019-7-27 11:7:34 +0800
dotnet

我在 Linq 很多函数都看到 __DynamicallyInvokable 这个特性,这是一个没有官方文档的特性,也许是用来优化反射

堆栈 网找到了以下描述

这个 __DynamicallyInvokable 特性是没有官方文档的,好像是在 .NET Framework 4.5 的一个优化添加的特性,这个特性看起来是在优化反射缓存的值,可以让随后的反射代码运行更快。从源代码里面的 System.Reflection.Assembly.cs 文件可以看到以下描述

 // 每个神奇的(blessed)的 API 都会添加 "__DynamicallyInvokableAttribute" 注释
// Each blessed API will be annotated with a "__DynamicallyInvokableAttribute".
// 这个 "__DynamicallyInvokableAttribute" 特性类是在他自己的程序集定义
// This "__DynamicallyInvokableAttribute" is a type defined in its own assembly.
// 所以他的构造函数总是一个 MethodDef 同时是 TypeDef 类型
// So the ctor is always a MethodDef and the type a TypeDef.
// 我们缓存此构造的 MethodDef 标记以便更快地进行自定义属性查找
// We cache this ctor MethodDef token for faster custom attribute lookup.
// 如果在程序集里面不包含这个特性,那么意味着这个程序集不存在任何神奇的(blessed)的 API 方法
// If this attribute type doesn't exist in the assembly, it means the assembly
// doesn't contain any blessed APIs.
Type invocableAttribute = GetType("__DynamicallyInvokableAttribute", false);
if (invocableAttribute != null)
{
Contract.Assert(((MetadataToken)invocableAttribute.MetadataToken).IsTypeDef); ConstructorInfo ctor = invocableAttribute.GetConstructor(Type.EmptyTypes);
Contract.Assert(ctor != null); int token = ctor.MetadataToken;
Contract.Assert(((MetadataToken)token).IsMethodDef); flags |= (ASSEMBLY_FLAGS)token & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_TOKEN_MASK;
}

源代码请看 Assembly.cs

最新文章

  1. 【JS】javascript 正则表达式 大全 总结
  2. gradle中使用嵌入式(embedded) tomcat, debug 启动
  3. LUA 利用#遍历表的问题
  4. 关于Switch结构利用
  5. Redis pipeline and list
  6. 【CLR VIA C#】读书笔记
  7. iOS相机权限、相册权限、定位权限判断
  8. LBS地理位置距离计算方法之geohash算法
  9. U盘安装centos 6.4教程(总算是弄好了
  10. [Angular 2] Rendering an Observable Date with the Async and Date Pipes
  11. 开始使用THREE.JS
  12. mysql导出数据表结构,必须退出mysql命令.重新使用msyqldump命令
  13. Hadoop(十一)Hadoop IO之序列化与比较功能实现详解
  14. LeetCode :My solution N-Queens
  15. 静态链表的C实现(基于数据结构 严蔚敏)
  16. Exp5 Msf基础应用 20164312 马孝涛
  17. 558. Quad Tree Intersection
  18. fastadmin模态框(弹出框)
  19. MySQL 之 数据操作
  20. Tomcat报failed to parse the expression [${xxx}]异常(javax.el.ELException)的解决方法

热门文章

  1. NX二次开发-将信息窗口中的文本保存到文本文件中UF_UI_save_listing_window
  2. 如何通过编程发现Java死锁
  3. Greenplum(PostgreSql)使用 with recursive 实现树形结构递归查询并插入新表
  4. 【JUC】JDK1.8源码分析之ConcurrentHashMap
  5. jquery操作html元素之(添加元素)
  6. beautifulsoup的使用
  7. C++之数据类型--整形&sizeof关键字
  8. POJ1149_PIGS(网络流/EK)
  9. 更改idea启动内存信息
  10. ASP.NET Core Web应用在发布时选择是否对视图进行编译