【C#dynamic 类型】常用用法示例。【转载】

源博客地址:https://blog.csdn.net/heyangyi_19940703/article/details/51190645

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

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

从知乎上看到一个比较好的例子回答:

什么时候用dynamic?

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值