您的位置: 飞扬精品软件园 >> 文章中心 >> 网络通讯 >> 网络应用 >> 拓展动态编程的新领域

相关文章链接

最新新闻资讯

    拓展动态编程的新领域

    拓展动态编程的新领域


    • 阅览次数: 文章来源: 原文作者: 整理日期: 2010-08-29


    (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代理对象。

    (3)C# 4动态编程技术内幕

    C#4中所定义的dynamic变量可以引用以下类型的对象:

    传统的“静态”的CLR对象。

    COM包装器对象。前面已经介绍了这方面的内容。

    实现了IDynamicMetaObjectProvider接口的“动态对象”,ExpandoObject就是这种类型对象的实例。

    基于DLR实现的动态语言(比如IronRuby和IronPython)所创建的对象。

    从C#程序员角度来看,所有这四种对象都是一样的,都可用一个dynamic变量引用之,而DLR在程序运行时动态地将方法调用和字段存取请求“绑定”到真正的对象上。

    dynamic的功能是由DLR所支撑的,是C#编译器与DLR分工合作的成果。

    请看以下示例代码:

    dynamic d = 100;
        d++;

    C#编译器在处理上述代码时,它并不去检查变量d是否可以支持自增操作,而是为其创建了一个CallSite<T>对象(<>p__Site1):

    private static class <Main>o__SiteContainer0 {
            public static CallSite<Func<CallSite, object, object>> <>p__Site1;
        }

    [1] [2] [3] [4] [5] [6]


查看所有评论

网友对拓展动态编程的新领域 的评论

网名:
主题:
内容:
验证码: