zoukankan      html  css  js  c++  java
  • C# Dynamic特性

     

    C# 4.0 dynamic:声明动态对象

    dynamic关键字用于声明一个动态对象,然后通过该动态对象去调用方法或读写属性。这是C#4.0 添加的特性。官方解释:dynamic类型是帮助我们绕过编译进行类型检查,相反这些操作是在运行时处理。

    两个缺点

    新功能有两个缺点:1)VS不会只能提示,只用依靠你自己了,因为鬼才知道你引用的未知对象中有哪些操作方法,只有运行时Running才可以知道。2)运行时间变慢,反射的封装(自动反射),反射的效率不高。

    应用场景

    在使用C# 2.0或3.0的时候,如果一个对象需要在运行时才能确定,并且没有接口和基类方面的信息,那我们一般使用反射技术来调用这个未知对像的方法或属性,而C# 4.0提供的dynamic可以帮我们简化这些工作。假设我们的程序会在运行时取得一个不确定类型的对象,但这个对象一定会有个Print()方法,我们需要调用这个方法打印出一些信息,那么在C# 4.0下面,我们可以用下面的两句代码来实现这个需求。

    dynamic unknowObj = GetDymanicObject();

    unknowObj.Print();

    这种解决方式比起用反射调用Print方法,应该简洁很多吧?程序员要做的就是别把方法名Print()打错,VS2010是不会为dynamic对象提供智能提示的,因为VS不知道运行时这个unknowObj会是什么。

    到这里,应该有不少的朋友可以从这个例子上看出,当程序编译到unknowObj.Print()的时候,VS会帮我们生成反射的代码,用反射的方式去调用Print这个方法,实质上就是帮我们自动反射了。

    如果能理解这一点,那也就不难理解C#为啥要搞dynamic这个既没智能感知,运行又慢的怪物出来了。

    按New features in CSharp 4的说法,dymanic主要应用于下面的场景:

    1、自动反射

    2、COM组件互操作

    3、混合编程,例如IronRuby和IronPython

    4、处理Html DOM对象

    如果有处理过上面这些工作的朋友们,应该不难理解了吧。

    具体的内容,还请大伙自己看看New features in CSharp 4,里面说得比较详细。

    以上就介绍了C# 4.0 dynamic的用途。

    举例子演示

    下面演示几个例子进一步说明这个关键字的使用,以及实用的主意事项。

    1)简单演示一个获得变量值的例子。

     1 class Program
     2 {
     3     static void Main(string[] args)
     4     {
     5         dynamic dyn = 1;
     6         object obj = 1;
     7 
     8         // Rest the mouse pointer over dyn and obj to see their
     9         // types at compile time.
    10         System.Console.WriteLine(dyn.GetType());
    11         System.Console.WriteLine(obj.GetType());
    12     }
    13 }
    View Code

    2)演示一个简单获取程序集对象的例子(使用Shell32下的ShellClass.Application获得文件属性)

     1 //获得程序的对象(通过程序的ProgramID)
     2 System.Type objType = System.Type.GetTypeFromProgID("Shell.Application");
     3 //根据获得的ProgramID对象程序集创建一个对象
     4 dynamic shell = System.Activator.CreateInstance(objType);
     5 //文件路径
     6 dynamic folder = shell.NameSpace(path.Substring(0, path.LastIndexOf("\")));
     7 //文件名称
     8 dynamic folderitem = folder.ParseName(path.Substring(path.LastIndexOf("\") + 1));
     9 if (Environment.OSVersion.Version.Major >= 6)
    10     {
    11     return folder.GetDetailsOf(folderitem, 27);
    12     }
    13 else
    14     {
    15     return folder.GetDetailsOf(folderitem, 21);
    16     }
    17         
    View Code
  • 相关阅读:
    BZOJ2555 SubString(后缀自动机+LCT)
    Luogu4770 NOI2018你的名字(后缀自动机+线段树合并)
    Luogu5284 十二省联考2019字符串问题(后缀树+拓扑排序)
    Codeforces Round #557 Div. 1 based on Forethought Future Cup
    【JS】window.print打印指定内容
    【PHP】Thinkphp 七牛云API对接
    【JS】JS实现时间戳转换成普通时间
    【CSS】非常简单的css实现div悬浮页面底部
    【PHP】php中json_decode()和json_encode()
    【Linux】安装mysql之设置远程访问权限
  • 原文地址:https://www.cnblogs.com/sunBolg/p/3457717.html
Copyright © 2011-2022 走看看