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

转载于:https://www.cnblogs.com/sunBolg/p/3457717.html

C# Dynamic特性相关推荐

  1. 使用dynamic特性处理XML文档

    处理XML文档是我们经常需要进行的一项工作,尤其是在进行网络服务相关编程时,比如更新RSS等.在.NET 3.5中引入了Linq To XML,使得XML文档的读写已经大大简化,而.NET 4.0中最 ...

  2. C# - dynamic 特性

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性. 比如,即使 ...

  3. 利用.net4.0的dynamic特性制造的超级简单的微信SDK

    1.基础支持API /*-------------------------------------------------------------------------- * BasicAPI.cs ...

  4. C#4.0新特性:可选参数,命名参数,Dynamic

    1.可选参数 可以为方法的参数设置一个默认值,如下: class Program { static void Main(string[] args) { Show(); Show("cary ...

  5. .Net 4.0 之 Dynamic 动态类型

    本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持.     一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和D ...

  6. Transformer不比CNN强!Local Attention和动态Depth-wise卷积的前世今生

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Qi Han@知乎(已授权) 来源丨https://zhuan ...

  7. Use DynamicXElement to create xml

    XML作为一种通用数据格式,.net进行了专门的封装.从开始的XMLDoc到现在的 Linq to XML一直不断的简化XML的操作. .net4.0的出现给偶们带来了dynamic特性,Expand ...

  8. C#开发Android应用的必备——Mono for Android V1.0 发布

    Mono for Android V1.0 正式发布啦! Mono for Android就是原先的MonoDroid,由于商标问题(名称中含有Droid),现在改名为Mono for Android ...

  9. ICLR 2022 | Transformer不比CNN强!Local Attention和动态Depth-wise卷积

    ©作者 | Qer 单位 | 南开大学 研究方向 | 计算机视觉 Transformer 的文章近两年来可谓是井喷式爆发,大量工作来设计各种任务上的 transformer 模型,然而,attenti ...

最新文章

  1. 学习用Pandas处理分类数据!
  2. Uncaught TypeError: Cannot read property ‘events‘ of undefined
  3. PHP.ini 中的错误提示
  4. mysql 5.7和8.0区别_前沿观察 | MySQL性能基准测试对比:5.7 VS 8.0
  5. get,post请求的编码统一
  6. 面试准备——Java回顾:高级编程(多线程、常用类、集合、泛型、IO流、反射、动态代理、新特性)
  7. 大数据分析,带你认识一个你从未见过的周杰伦
  8. 自定义办法设置 localStorage 过期时间
  9. 塞班系统微信连接不上服务器,充满情怀的塞班系统:手机QQ、微信将无法登陆使用...
  10. 国际奥林匹克运动会是怎么来的?
  11. 不负韶华 只争朝夕(2019年终报告)
  12. 站在知乎肩上-做更强的自己(3)
  13. python图片自动上色_自己实现黑白图片自动上色AI(一)
  14. 巨头发力,社区电子商务发展加速
  15. Weighted Interval Scheduling
  16. mongo从开始到安装以及遇到的问题
  17. C#最小二乘法进行曲线拟合及相关系数
  18. 博弈论分析题_博弈论复习题及答案
  19. SqlServer-IN写法(普通、存储过程)
  20. 如何通过OKR工具帮助日常工作落地

热门文章

  1. C#.Net网页加载等待效果漂亮并且简单
  2. 高效使用Bitmaps(二) 后台加载Bitmap
  3. jQuery UI Autocomplete示例(一)
  4. javascript经典广告代码.rar
  5. 小程序文本溢出显示省略号(单行/多行)
  6. numpy的array合并-【老鱼学numpy】
  7. 作业九 ——报告及总结
  8. Remoting 与 Webservice 的区别
  9. 第19章 归档模式下的数据库恢复
  10. 系统集成项目管理工程师-项目人力资源管理笔记