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.WriteLine(textData1.toupper());  
  9.     Console.WriteLine(textData1.Foo(10, "ee", DateTime.Now));  
  10.   }  
  11.   catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)  
  12.   {  
  13.     Console.WriteLine(ex.Message);  
  14.   }  

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

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

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

你可能感兴趣的:(#,Visualstudio)