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:列举具体事例)

dynamic关键字的更多相关文章

  1. C#中Dynamic关键字

    dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能. 什么是"动态"? 编程语言有时可以划分为静态类型化语言和动态类型化语言.C#和Java经常被认为是静 ...

  2. 浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)

    C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢? 从最简单的示例开始: static void Main(string[] args) { d ...

  3. C# 动态语言特性,dynamic 关键字研究

    1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...

  4. C#中 dynamic 关键字

       所有表达式都能隐式的转换成dynamic,因为所有的表达式最终都能生成从Object派生出的类型. ; int b = a; //隐式转换错误 int b2 = (int)a; ; int b3 ...

  5. C#4.0中的dynamic关键字和ExpandoObject对象

    dynamic最大的特点我想莫过于在它的类型在运行时才确定,这也是它与往静态类型关键字的最大区别.如果你在你的代码操作中用到了dynamic关键字去定义一个变量时,那么这个变量在编译的时候编译器不会对 ...

  6. Swift dynamic关键字

    使用dynamic关键字标记属性,使属性启用Objc的动态转发功能: dynamic只用于类,不能用于结构体和枚举,因为它们没有继承机制,而Objc的动态转发就是根据继承关系来实现转发. 参考资料: ...

  7. dynamic关键字的使用

    https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonConvert.htm 在使用DeserializeObject函数进行 ...

  8. Dart编程实例 - Dynamic 关键字

    Dart编程实例 - Dynamic 关键字 void main() { dynamic x = "tom"; print(x); } 本文转自:http://codingdict ...

  9. C#dynamic关键字(1)

    一.object,var,dynamic的区别 static void Main() { //var是C# 3中引入的,其实它仅仅只是一个语法糖. var本身并不是一种类型, 其它两者object和d ...

随机推荐

  1. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  2. 【HTML】Intermediate1:Span&Div

    1.HTML is all bout applying meaning to content. The span & div tags apply no meaning at all=mean ...

  3. 经典sql总结(1)

    1.表示info 信息,字段为Id和res,如何得到如下结果

  4. Docker系列(五)OVS+Docker网络打通示例

    环境说明 两个虚拟机 操作系统Centos7 DOcker版本1.8 脚本内容: 1  4  7  10  19  27  32    33  39   -j ACCEPT 47    48  # R ...

  5. HDU1075 - What Are You Talking About(Trie树)

    题目大意 给定一些火星文单词以及对应的英语单词,然后给你一些火星文,要求你翻译成对应的英文 题解 第一次写Trie树! 把所有火星文单词插入到Trie树中,并且每个火星文单词结尾的节点记录相应英文单词 ...

  6. CSS 中常用的选择器(选择符)

    一.标签选择器:直接将HTML标签(Tag)作为选择器,可以是p.h1.dl.strong等HTML标签.如: p { font:12px;}em { color:blue;}dl { float:l ...

  7. linux文件权限查看及修改-chmod

    查看linux文件的权限:ls -l 文件名称 查看linux文件夹的权限:ls -ld 文件夹名称(所在目录) 修改文件及文件夹权限: sudo chmod -(代表类型)×××(所有者)×××(组 ...

  8. MyBatis Oracle批量更新

    <update id="updateProductSerialNo" parameterType="java.util.List"> <for ...

  9. JVM之---Java内存分配参数(第四篇)

    1.内存分配参数---大纲 Ø如何设置堆内存 Ø如何设置栈内存 Ø如何设置方法区 Ø如何设置对的分配比率 Ø设置参数打印堆栈: ØJava程序的两种模式:Server&Client 2.设置堆 ...

  10. JAVA中使用Redis

    上节讲解了如何在centos上安装redis,点击查看.本节我们学习在java中使用redis.需要将jedis-*.jar添加到classpath(点击下载),如果使用连接池还需要commons-p ...