这些动态添加的成员与普通的类成员用法一样:
for (int i = 0; i < 10; i++) dynamicObj.Increment();//调用方法 Console.WriteLine("dynamicObj.Value={0}",dynamicObj.Value);//访问字段 |
ExpandoObject对象实现了IDictionary<string, object>接口,可看成是一个字典对象,所有动态添加的成员都是这个字典对象中的元素,这意味我们不仅可以添加新成员,还可以随时移除不再需要的成员:
//移除Increment方法 (dynamicObj as IDictionary<string, object>).Remove("Increment"); |
方法移除之后,再尝试访问此方法将引发RuntimeBinderException异常。
(2)使用dynamic关键字简化与COM组件交互的代码
要在.NET这个“托管世界”里调用“非托管世界”中的COM组件,我们必须通过 “互操作程序集(Interop Assembly)”作为桥梁,“互操作程序集”定义了CLR类型与COM类型之间的对应关系。
只要给.NET项目添加对“互操作程序集”的引用,就可以在.NET应用程序中创建这一程序集所包容的各种类型的实例(即COM包装器对象),对这些对象的方法调用(或对其属性的存取)将会被转发给COM组件。
以调用Word为例,在C# 4.0之前您可能经常需要编写这样的代码:
Object wordapp = new Word.Application(); //创建Word对象 Object fileName = “MyDoc.docx” ;//指定Word文档 Object argu = System.Reflection.Missing.Value; Word.Document doc = wordapp.Documents.Open(ref fileName, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu, ref argu); |
上述对Open()方法的调用语句只能用“恐怖”一词来形容,其原因是Word组件中的Open()方法定义了太多的参数。
C#4使用dynamic关键字,配合从Visual Basic中学来的“命名参数与可选参数”这两个新语法特性,可以写出更简洁的代码:
dynamic wordapp = new Word.Application(); dynamic doc = wordapp.Documents.Open(FileName: “MyDoc.docx”); |
上述代码中省去了用不着的参数,并且可以去掉参数前的ref关键字。
当上述代码运行时,DLR会使用反射技术将dynamic表达式“绑定(bind)”到COM互操作程序集中所包容的Word.Application代理对象。