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