Microsoft.CSharp.dll程序集的作⽤
《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.
5.  try
6.  {
7.    Console.WriteLine(textData1.ToUpper());
8.    Console.upper());
9.    Console.WriteLine(textData1.Foo(10, "ee", DateTime.Now));
10.  }
11.  catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
12.  {
13.    Console.WriteLine(ex.Message);
14.  }
15. }
在调⽤这个⽅法时,会发现对ToUpper()⽅法(注意T和U这两个字母)的调⽤正确⽆误,但控制台上还是会显⽰⼀条错误数据。
1. HELLOwriteline方法的作用
2. 'string' does not contain a definition for 'toupper'
当然,如果将所有动态⽅法的调⽤都⽤try/catch块来包裹,这个过程将是⼗分⿇烦的。只要注意了拼写和参数传递,就没有必要都进⾏包裹。但是,当你不确定⽬标类型是否包含某个成员的时候,如果⽤try/catch块来进⾏包裹的话,那么异常的捕获就会⼗分⽅便了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。