什么是动态类型

了解什么是动态类型首先我们了解静态类型,在我们平时定义一个int i=1就是静态类型,静态类型就是我们在没有编译的时候已经明确的知道他是一个int类型,动态语言是我们在运行时才会知道的类型。所以我们在编写动态类型的时候是无法使用vs的智能提示,因为编译器也不知道他是一个什么类型。

dynamic i = 1;
Console.WriteLine(i.GetType());
dynamic str = "1";
Console.WriteLine(str.GetType());

引用一张结构图

从图中可以看出,DLR是建立在CLR的基础之上的,其实动态语言运行时是动态语言和C#编译器用来动态执行代码的库,它不具有JIT编译,垃圾回收等功能。DLR通过它的绑定器(binder)和 调用点(callsite),元对象来把代码转换为表达式树,然后再把表达式树编译为IL代码,最后 由CLR编译为本地代码(DLR就是帮助C#编译器来识别动态类型)。

dynamic和var区别

var关键字不过是一个指令,它告诉编译器根据变量的初始化表达式来 推断类型。(记住var并不是类型),而dynamic是类型,但是编译时不属于CLR 类型(指的int,string,bool,double等类型,运行时肯定CLR类型中一种的),它是包含了 System.Dynamic.DynamicAttribute特性的System.Object类型,但与object又不一样,不一样主要体现在动态类型不会在编译时时执行显式转换

使用动态类型的优点

1.减少强类型的转换

2.延迟加载

3.调用C#类型中不存在的其他语言的类型

使用动态类型的缺点

1.没有智能提示

2.需要预先知道接收的数据结构

动态语言的约束

1不能用动态类型作为扩展方法的参数

2委托和动态类型不能隐式转换

3动态类型不能调用构造函数和静态方法

4类型声明和泛型类型参数

5类型声明和泛型类型参数不能声明一个基类为dynamic的类型,也不能将dynamic用于类型参数的约束,或作为类型 所实现的接口的一部分

实现动态行为

我们实现动态行为微软给我们提供了三种方式,下面我们来试一试:

使用ExpandObject

static void Main(string[] args)
{dynamic expand = new ExpandoObject();//动态为expand类型绑定属性expand.Name = "王麻子";expand.Age = 24;//动态为expand类型绑定方法expand.AddMethod = (Func<int, string>)(x => $"你传进来的是{x}");                                                //调用expand类型的属性和方法                                              Console.WriteLine($"姓名:{expand.Name}\n年龄:{expand.Age}\n绑定方法:{expand.AddMethod(666)}");Console.Read();
}
姓名:王麻子
年龄:24
绑定方法:你传进来的是666

使用DynamicObject

class DynamicType : DynamicObject
{// 重写方法,                                                    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result){Console.WriteLine(binder.Name + "方法被调用");result = null;return true;}public override bool TrySetMember(SetMemberBinder binder, object value){Console.WriteLine(binder.Name + "属性被设置," + "设置的值为:" + value);return true;}
}class Program
{static void Main(string[] args){dynamic dynamicobj = new DynamicType();dynamicobj.CallMethod();dynamicobj.Name = "王麻子";dynamicobj.Age = "24";Console.Read();}
}
CallMethod方法被调用
Name属性被设置,设置的值为:王麻子
Age属性被设置,设置的值为:24

实现IDynamicMetaObjectProvider接口

class Metadynamic : DynamicMetaObject
{internal Metadynamic(Expression expression, DynamicType2 value) : base(expression, BindingRestrictions.Empty, value) { }//重写响应成员调用方法                               public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args){//获得真正的对象                                               DynamicType2 target = (DynamicType2)base.Value;Expression self = Expression.Convert(base.Expression, typeof(DynamicType2));var restrictions = BindingRestrictions.GetInstanceRestriction(self, target);//输出绑定方法名                                             Console.WriteLine(binder.Name + "方法被调用了");return new DynamicMetaObject(self, restrictions);}
}
public class DynamicType2 : IDynamicMetaObjectProvider
{public DynamicMetaObject GetMetaObject(Expression parameter){Console.WriteLine("开始获得元数据......");return new Metadynamic(parameter, this);}
}class Program
{static void Main(string[] args){dynamic dynamicobj2 = new DynamicType2();dynamicobj2.Call();Console.Read();}
}
开始获得元数据......
Call方法被调用了

Dynamic动态类型相关推荐

  1. .Net 4.0 之 Dynamic 动态类型

    本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持.     一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和D ...

  2. c# dynamic动态类型和匿名类

    dynamic类型 简单示例 dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写 expando.Id = 1; e ...

  3. 动态类型var和dynamic和传统确定类型区别和效率

    伴随着vs2010的出现,c#4.0的诞生,与之而来的动态类型dynamic更是给net程序员们锦上添花,为自己的程序书写上带来了给大的便利.可到底怎么用,好不好用,效率这么样,也许是大家最迫切关注的 ...

  4. C#中动态类型dynamic用法浅析

      动态类型dynamic是微软在.net framework 4.0开始引入的,其目的是在程序编译过程中忽略对类型的检查,等到运行时刻再明确定义的对象的类型.   使用dynamic类型可以简化代码 ...

  5. var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. python 动态类型_动态类型(Dynamic type)

    在学习更复杂的对象类型之前,先掌握python的动态类型这一概念,是十分必要的.动态类型以及它提供的多态性是python语言简洁性和灵活性的基础. -------------------------- ...

  7. 【.net深呼吸】动态类型(高级篇)

    前面老周给大家介绍了动态类型使用的娱乐级别用法,其实,在很多情景下,娱乐级别的用法已经满足需求了. 如果,你想自己来控制动态类型的行为和数据的存取,那么,就可以考虑用今天所说的高大上技术了.比如,你希 ...

  8. [C#基础知识系列]专题十七:深入理解动态类型

    本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善--Com 互 ...

  9. Python进阶09 动态类型

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢TeaEra, 猫咪cat 动态类型(dynamic typing)是Pyth ...

最新文章

  1. R语言问题解决:Error: Discrete value supplied to continuous scale
  2. EA与Rose UML建模工具比较
  3. 按钮点击_如何设置微信小程序按钮点击事件?
  4. 主成分分析法_数学建模 || 葡萄酒的评价(1)主成分分析法
  5. Hybrid A*论文解析(2)
  6. Rabbtmq Confirm 确认消息
  7. KVM虚拟机安装使用教程(Ubantu)
  8. 如何在windows2003(IIS6)下配置IIS,使其支持cshtml
  9. LAMP环境安装1之freetype
  10. 总线、设备和驱动的关系
  11. python安装与开发环境搭建实验总结_python开发环境安装配置
  12. Gogs代码托管系统安装配置手册
  13. PHP中的预定义常量、预定义变量、魔术常量
  14. 10、斐波那契数列,跳台阶问题(Python)
  15. [蓝牙 4.0 CC2541开发] BLE协议栈 GAP GATT
  16. 传奇开服很难吗?教你怎么给Hero传奇引擎添加NPC
  17. 微信读书 iOS 性能优化总结
  18. Eclipse简明使用教程(java集成开发环境)
  19. JAVA 对 海康SDK二次开发
  20. (一)机器学习入门与经典算法之KNN算法(第一期)

热门文章

  1. 关键段 互斥量 以及信号量
  2. 购买域名,购买公网IP,实现同一个IP绑定多个域名
  3. C/C++面试题—链表中倒数第k个结点
  4. vue js 和原生app调用回调方法问题
  5. 常用前端代码资源(转)
  6. 验证登陆信息的合法性
  7. Linux同步目录 保留文件修改时间和权限 rsync
  8. .net大型分布式电子商务架构说明(转载来自头条)
  9. Java容易搞错的知识点
  10. Qt入门(11)——Qt插件