《C#与.NET 4高级程序设计:第5版》第18章动态类型和动态语言运行时,本章,我们将学习dynamic关键字的方方面面,理解如何使用DLR (Dynamic Language Runtime,动态语言运行时)将松散的类型映射到正确的内存对象。理解了DLR提供的诸多服务之后,你将看到一些示例,它们使用动态类型来简化后期绑定方法的调用(通过反射服务)并且可以方便地与遗留的COM库进行通信。本节为大家介绍Microsoft.CSharp.dll程序集的作用。

作者:朱晔 等译来源:人民邮电出版社|2011-04-03 12:59

收藏

分享

18.1.2 Microsoft.CSharp.dll程序集的作用

当使用Visual Studio 2010新建一个C#项目时,将自动引用一个名为Microsoft.CSharp.dll的.NET 4程序集(可以在Solution Explorer的References文件夹下找到)。这个库非常小,只定义了一个命名空间(Microsoft.CSharp.RuntimeBinder)和两个类(如图18-2所示)。

 
(点击查看大图)图18-2 Microsoft.CSharp.dll程序集

顾名思义,这两个类为强类型的异常类。RuntimeBinderException是最普通的类,如果试图调用一个不存在的动态数据类型的成员,将会抛出该异常(比如调用toupper()和Foo()方法)。如果调用了一个存在的成员但却指定了错误的参数数据,将同样会抛出该异常。

由于动态数据的这种不确定性,在调用用C#的dynamic关键字声明的变量的成员时,可以用合适的try/catch块来包裹,并以一种优雅的方式来处理异常。

 
  1. static void InvokeMembersOnDynamicData()
  2. {
  3. dynamic textData1 = "Hello";
  4. try
  5. {
  6. Console.WriteLine(textData1.ToUpper());
  7. Console.WriteLine(textData1.toupper());
  8. Console.WriteLine(textData1.Foo(10, "ee", DateTime.Now));
  9. }
  10. catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
  11. {
  12. Console.WriteLine(ex.Message);
  13. }
  14. }

在调用这个方法时,会发现对ToUpper()方法(注意T和U这两个字母)的调用正确无误,但控制台上还是会显示一条错误数据。

 
  1. HELLO
  2. 'string' does not contain a definition for 'toupper'

当然,如果将所有动态方法的调用都用try/catch块来包裹,这个过程将是十分麻烦的。只要注意了拼写和参数传递,就没有必要都进行包裹。但是,当你不确定目标类型是否包含某个成员的时候,如果用try/catch块来进行包裹的话,那么异常的捕获就会十分方便了。

Microsoft.CSharp.dll程序集的作用相关推荐

  1. 找不到编译动态表达式所需的一种或多种类型。是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?...

    提示"找不到编译动态表达式所需的一种或多种类型.是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用? "错误 解决方法:   将引入的 ...

  2. 修复SQL Server 2016年Microsoft.AnalysisServices.AdomdClientUI.dll程序集错误的前4个选项

    I've always been in favor of an orthodox strategy when it comes to applying SQL Server updates which ...

  3. 关于异常Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

    关于Microsoft.CSharp.RuntimeBinder.RuntimeBinderException的异常一般来自于两种, 第一种: Predefined type 'Microsoft.C ...

  4. Microsoft.CSharp.CSharpCodeProvider

    Microsoft.CSharp.CSharpCodeProvider MSDN 提供对 C# 代码生成器和代码编译器的实例的访问.类提供可用来检索 C# ICodeGenerator 和 ICode ...

  5. CS0656 缺少编译器要求的成员“Microsoft.CSharp..........

    严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS0656 缺少编译器要求的成员"Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo ...

  6. 解决SQL Server 导入System.Web.dll程序集,报错问题

    本人由于需要做一个小项目,项目的内容是这样的:SQl Server中有个报警信息表(tb_Alarm_info),当这个报警信息表有新的数据插入时,将这个产生的报警信息发送到相关人员手机上: 解决思路 ...

  7. 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入

    用记事本打开专案资料夹里的 *.csproj 找到<ItemGroup>区段 手动加入 <Reference Include="Microsoft.CSharp" ...

  8. vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装。的解决方法

    vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装.的解决方法 参考文章: (1)vmware tools安装程序无法继续,Microsoft R ...

  9. 安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安装,解决方法

    安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安装,解决方法 参考文章: (1)安装VMware,出现Microsoft Runtime DLL 安装程序未能完成安 ...

最新文章

  1. UVA116 单向TSP Unidirectional TSP(多阶段决策问题、输出字典序最小的方案、DAG上DP)
  2. 悬挑脚手架卸载钢丝绳要求_100m的悬挑脚手架技术交底
  3. 从零开始の后缀自动机
  4. main函数的参数详解,它们是何时何处传入的?(main函数的参数值是从操作系统命令行上获得的)
  5. Oracle imp字符集转换,imp/exp 字符集转换
  6. 企业云桌面-03-安装第1个企业 CA-013-CA01
  7. 中动态路径加载_GOT段在linux系统中实现代码动态加载的作用和其他段的说明
  8. MySQL千万级别大表如何优化?
  9. crontab 指令笔记
  10. 2018年7月3日笔记
  11. 88se9230 linux raid,M.2转4口SATA 6G RAID阵列卡 (PCIe2.0),IO-M2F9230-4IR
  12. 全国哀悼日,网站变成黑白色
  13. python爬虫 点击下一页,总结python爬虫抓站的实用技巧 python爬虫怎么获取下一页的url...
  14. Dissect Certificate
  15. POJ 1625 Censored!(自动机DP+高精度)
  16. springboot考研规划系统 毕业设计-附源码541230
  17. (转载)JavaScript:双波浪号“~~“ 与 Math.floor()
  18. 抖音seo搜索是什么?源码部署-seo排名系统源码分析
  19. LeetCode——桶的思想
  20. qt 判断ctrl键被按下_赵锁仙原创:当我按下注销键之后

热门文章

  1. 实验吧—Web——WP之 Guess Next Session
  2. C#中yield return用法
  3. 同步,异步,多线程,你怎么看?
  4. HDOJ 1875 畅通工程再续
  5. Powershell 最大值堆栈实现
  6. redis存储数据类型_Redis与Memcahe的区别最全整理
  7. python爬取百度贴吧中的所有邮箱_python写的百度贴吧邮箱采集(带界面)
  8. linux内核 频率,Linux内核中CPU主频和电压调整 (三)
  9. mysql.data.dll win10_【MySQL】Windows10下安装
  10. 详解公钥、私钥、数字证书的概念