【C#dynamic 类型】

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


你可能感兴趣的:(C#,博客)