在通过 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里面的算法参数传递改进上.