在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查,改为在运行时解析这些操作。dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。
在大多数情况下,dynamic 类型与 object 类型的行为是一样的。但是,不会用编译器对包含dynamic 类型表达式的操作进行解析或类型检查。编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。在此过程中,类型dynamic 的变量会编译到类型 object 的变量中。因此,类型dynamic 只在编译时存在,在运行时则不存在。
运用例子:如果我们在现实开发中遇到参数传递不确定性字段时候,可以通过dynamic创建运行时解析的对象,避免去创建更多的实体类对象!
如:我要计算店铺的租金,每个店铺的衡量标准不一样,计算该商店的算法需求的变量类型,个数不一样,难要为每个算法创建对应的对象进行传递,获取相应的参数进行技术吗?考虑到这样的问题我们可以通过dynamic 类型进行约束。
1.创建算法行为类,构造方法中传递要计算的参数对象。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 计算行为类 /// </summary> public class calculate { /// <summary> /// 运行时的参数传递对象 /// </summary> private dynamic _obj; public calculate(dynamic obj) { this._obj = obj; } /// <summary> /// A类型算法的计算租金=monthnum*monthprice+Commissionpric /// </summary> public double AtypRental() { Console.WriteLine("A类型算法的计算租金=monthnum*monthprice+Commissionpric"); return (int)this._obj.monthnum * (double)this._obj.monthprice + (double)this._obj.Commissionpric; } /// <summary> /// B类型算法租金=daynum*dayprice /// </summary> public double BtypRental() { Console.WriteLine("B类型算法租金=daynum*dayprice"); return (int)this._obj.daynum * (double)this._obj.dayprice; } } }2.调用如下:
using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { dynamic aobj = new ExpandoObject();//创建运行时解析的对象,用于传递A类型计算方法的参数 aobj.monthnum = 30; aobj.monthprice = 6000; aobj.Commissionpric = 3000; calculate cs = new calculate(aobj); double aprice=cs.AtypRental(); Console.WriteLine("A类型计算结果:" + aprice); dynamic bobj = new ExpandoObject();//创建运行时解析的对象,用于传递B类型计算方法的参数 aobj.daynum = 300; aobj.dayprice = 30; calculate cs2 = new calculate(aobj); double bprice= cs2.BtypRental(); Console.WriteLine("B类型计算结果:" + bprice); //在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查,改为在运行时解析这些操作。 //dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 //HTML 文档对象模型 (DOM) 的访问。 //所有我们在使用dynamic时类型进行参数传递时候要做好变量名称的约束。 } } }
这里的参数传递可以运用到 C# 设计模式—工厂方法模式 Demo里面的算法参数传递改进上.