public class TestClass
{
  public dynamic Values { get; set; }

}

public class Test

{

  static void Func(TestClass test)

  {

    if(test.Values != null)

    {

      // ...

    }

  }

}

反编译后的内容:

if ((<Func>o__SiteContainer0.<>p__Site1 == null)

{

  <Func>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, object, object>>.Create(

      Binder.BinaryOperation(CSharpBinderFlags.None,

      ExpressionType.NotEqual,

      typeof (Test),

      (IEnumerable<CSharpArgumentInfo>) new CSharpArgumentInfo[2]
      {
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, (string) null),
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant, (string) null)
      }));
}

总之,编译器会将Dynamic关键字修饰的字段在调用的位置生成一些Microsoft.CSharp.RuntimeBinder

命名空间中预定义的基础设施生成静态字段和方法,并通过为空判断实现缓存功能,提高运行效率的同时,利用反射和其他功能完成对动态字段的操作。

了解了两者之间的编译转换关系及该命名空间中的相关枚举类型的含义,可以很容易的分辨出.NET反编译代码中的那个object字段为dynamic字段,并将使用CallSite/SiteContainer/Site/Target/Binder等反编译代码调用恢复为正常的使用dynamic字段的代码。(Todo:列举具体事例)

最新文章

  1. Python swapcase()方法
  2. Win10下PB停在欢迎窗口界面
  3. Django~NewProject and APP
  4. js正则验证&quot;汉字&quot;
  5. PHP 生成唯一激活码
  6. 事件驱动的简明讲解(python实现)
  7. css清除浮动的八大方法
  8. CentOS7脱机安装SQL Server 2017
  9. Hexo博客框架
  10. 宝塔面板配置阿里云SSL证书流程
  11. DBS:TestSys
  12. linux 查看任务运行时间
  13. 006-UDP用户数据报文协议
  14. Java之多线程 Atomic(原子的)
  15. 纯CSS实现3D图像轮转
  16. vim复制粘贴常用命令
  17. ArcGIS中的坐标系统定义与投影转换
  18. java代码-------Runnable的用法
  19. 一个SAP开发人员的2017总结
  20. JAVA中代码前加@有什么作用

热门文章

  1. [转]WinForm如何调用Web Service
  2. [Stephen]Export from Excel to ALM
  3. 录制屏幕(gif)便于在博客中嵌入软件licecap
  4. 【原】模式之-适配器Adapter模式
  5. mysql 资料总结 长期更新
  6. Sql-&gt;Linq-&gt; Lambda 相互转换
  7. HDOJ-ACM1020(JAVA)
  8. devexpress中gridcontrol 一些样式改变
  9. epoll原理解释(转)
  10. java常见算法