C#4.0 新特性 动态类型Dynamic

.NET Var与Dynamic 隐式类型 静态类型 动态类型 关键字dynamic声明的变量在声明时不需要初始化此类型的变量,因为编译器在编译时不知道变量的类型。关键字var声明的变量应在声明时初始化,这样编译器就会根据初始化的值来决定变量的类型。关键字dynamic是在C#4.0中引入的,声明的变量是动态类型的,变量的类型由编译器在运行时决定。var表示“变量的类型是在编译时决定的”,但是dynamic表示“变量的类型是在运行时决定的”。关键字var是在C#3.0中引入的,声明的变量是静态类型的,变量的类型由编译器在编译时决定。它只能用作函数中的局部变量。..... 阅读详情

转自 http://www.cnblogs.com/ryanding/archive/2010/12/09/1900106.html



        本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持。

 

    一、.net4.0主要新特性


        .Net4.0在.Net3.5基础上新增的主要特性有:可选参数、命名参数和Dynamic。具体请阅生鱼片的这篇博文。这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下。总之.Net在不断进步中。

 

     二、ExpandoObject普通应用  


       ExpandoObject 类,“需引用System.Dynamic命名空间” 。请看以下代码:       

复制代码
    
1 dynamic Customer = new ExpandoObject(); 2 Customer.Name = " Lucy " ; 3 Customer.Age = 20 ; 4 Customer.Female = true ; 5 Console.WriteLine(Customer.Name + Customer.Age + Customer.Female); 6 Console.ReadKey();    
复制代码

输出<< Lucy20True,这里已经类似javascript 的var obj ={}; obj.Name ='lucy'。但又不完全相同,因为不能在clr运行时动态生成属性或者方法。但至少比.NET3.5先进了。

 

    三、Dynamic 动态类型对DuckType 的支持


      1.前不久在园子里面看见了thinking的这篇博文,文中有这么一段代码:

复制代码
    
static class Calculator { public static T Add < T > (T t1, T t2) { dynamic d1 = t1; dynamic d2 = t2; return (T)(d1 + d2); } } public static void Main( string [] args){ int i = Calculator.Add( 1 , 2 ); double d = Calculator.Add( 1.1 , 2.2 ); string s = Calculator.Add( " abc " , " def " ); Console.WriteLine(i + " " + d + " " + s); }
复制代码

输出:

>>3 3.3 abcdef

作者在文中指出了以上C#代码是为了通过动态类型来实现基于duck typing的泛型参数约束。

为了在C#支持Duck Type还有一个重要的.Net4.0特性有必要提及到,这也是本文重点讨论的内容。

它就是:“DynamicObject” 该类位于System.Dynamic 命名空间下。在VS2010内就可以看见该类的成员列表,截图如下:

所属方法都是虚方法,我们可以重写这些虚方法。这里主要看TryInvokeMember()方法。这个方法VS2010给出了详细的描述。

根据VS2010注释,由于我的VS2010是英文版的,这里就不贴出英文注释了。简单介绍一下如何使用这个方法:假设我们一个类OurClass它继承了DynamicObject 这个Class。OurClass中有一个方法OurMethod()。接着在OurClass 类中 重写 TryInvokeMember这个基类虚方法。以上设置完后以后只要OurClass 的OurMethod方法一旦被调用都先执行一下重写后的

     TryInvokeMember()方法。也许您会问这样到底有何用途?OK!请先看javascript这段代码片段:

复制代码
    
1 function tryInvokeMember(obj) { 2 if (obj && typeof obj.ourMethod === " function " ) { 3 return obj.ourMethod(); 4 } 5 alert( ' 未找到! ' ); 6 return null ; 7 } 8 9 var ourObj1 = {}; 10 ourObj1.Method = function () { 11 alert( ' 111 ' ); 12 }; 13 14 var ourObj2 = {}; 15 ourObj2.ourMethod = function () { 16 alert( ' 已经找到ourMethod并且执行 ' ); 17 }; 18 19 tryInvokeMember(ourObj1); 20 tryInvokeMember(ourObj2);
复制代码
大家读完 这段 js代码后应该会明白为什么我要重点讨论C#4.0中的DynamicObject了吧?真正的目的就是:在DuckType 类(鸭子) 方法(鸭子叫)执行之前,我们要判断对象的类是否是具备鸭子叫的功能?如果不具备就不应该执行,否则程序势必会抛出异常。C#中如何实现呢?步骤如下:

      1、建立DynamicAnimal 类继承DynamicObject类,并且重写TryInvokeMember虚方法:

复制代码
    
public class DynamicAnimal : DynamicObject { public override bool TryInvokeMember(InvokeMemberBinder binder, object [] args, out object result) { bool success = base .TryInvokeMember(binder, args, out result); // 如果方法不存在,请将result 这个out参数赋值为null if ( ! success) result = null ; // 如果这个地方返回false 将会引发异常 return true ; } }
复制代码

     2、建立两个DuckType类,分别为Duck 和 Human:

复制代码
    
1 public class Duck : DynamicAnimal 2 { 3 public string Quack() 4 { 5 return " 鸭子嘛,就Quack吧! " ; 6 } 7 } 8   public class Human : DynamicAnimal 9 { 10 public string Talk() 11 { 12 return " 人类是用Talk,而不是Quack " ; 13 } 14 }
复制代码

    3、在Console 内 建立DuckType的调用方法:

    
1 public static string DoQuack(dynamic animal) 2 { 3 string result = animal.Quack(); 4 return result ?? " ...人类当然不会鸭叫... " ; 5 }
    4、Console 内 Main方法调用:

复制代码
    
1 static void Main( string [] args) 2 { 3 var duck = new Duck(); 4 var cow = new Human(); 5 Console.WriteLine( " 鸭子是Quack " ); 6 Console.WriteLine(DoQuack(duck)); 7 Console.WriteLine( " 人类是talk " ); 8 Console.WriteLine(DoQuack(cow)); 9 Console.ReadKey(); 10 }
复制代码
程序 执行结果 如下:


【GlobalMapper精品教程】084:tif(tfw)、jpg(jgw)、png(pgw)的区别与联系 摘要:本文介绍了TFW、JGW、PGW等地理参考文件的基本原理和应用。这些文件通过简单的文本格式存储栅格图像的地理坐标信息,适用于平面坐标系下的GIS数据处理。文章详细说明了文件各行的含义,并提供了在ArcGIS和Globalmapper中生成这些文件的具体操作步骤,包括导出TIFF、JPG、PNG格式时勾选生成对应坐标文件的选项。这些文件虽然简单易用,但仅适用于平面坐标系,且功能相对有限。配套视频教程提供了更详细的操作演示。 阅读详情

相关推荐

保姆级教程:Synology NAS共享文件夹从创建到权限设置的完整流程

本文提供了一份详尽的Synology NAS共享文件夹创建与权限设置指南。重点讲解了如何将NAS接入企业AD域,并利用域管理员账户进行集中身份验证和权限管理。文章从基础概念、域环境配置、文件夹创建、精细化权限分配到客户端访问与维护,完整覆盖了构建安全高效企业级文件共享空间的全流程,旨在帮助管理员实现便捷的团队协作与数据安全管理。

u9v0w的博客 552

.net dynamic生成动态匿名类

dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写 expando.Id = 1; expando.Name = "Test"; string json = Models.Json.ToJson(expando); //输出{Id:1,Name:'Test'} //动态添加字...

匠工 1373

华为Atlas 300I推理卡驱动安装全攻略:从环境检查到常见问题解决

本文提供了华为Atlas 300I推理卡驱动安装的完整实战指南。从安装前的系统环境检查、内核版本匹配,到详细的二进制.run文件安装步骤、源码编译及高级定制化部署,涵盖了驱动安装的全流程。文章重点解析了安装过程中的关键决策、常见问题排查与解决方案,并针对生产环境的多卡配置、性能调优及安全加固给出了专业建议,旨在帮助用户高效、稳定地完成AI推理加速卡的部署。

swift5iosmith的博客 628

.net中dynamic类型的使用

 一、使用dynamic类型要注意的地方 1、由于dynamic类型的变量在设计时是未知的,因此无法看到Visual Studio对dynamic类型变量的成员进行自动提示,因为编译器也不知道。 2、由于dynamic类型变量的具体类型要在运行时才能确定,因此你对该变量的成员调用必须是正确的,如果调用了变量没有的属性或方法,将会产生异常。   二、dynamic类型常

whaxrl的专栏 5870

CentOS 7升级GCC踩坑记:明明装了centos-release-scl,为啥找不到devtoolset-9-gcc-c++?

本文详细记录了在CentOS 7系统中升级GCC时遇到的`devtoolset-9-gcc-c++`不可用问题及其解决方案。通过分析`centos-release-scl`安装不完整的原因,提供了从清理残留、重新安装仓库配置到完整安装devtoolset-9工具链的全套操作指南,帮助开发者彻底解决类似环境配置难题。

weixin_29252171的博客 244

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

statistics+insight+vista+power 903

.Net Core3.1 WebApi 传参数dynamic类型,直接使用解析报错解决方法

从 Net 4.5版本 迁移至NetCore3.1时,WebApi中直接dynamic传参,使用会报错,错误信息如下: {"'System.Text.Json.JsonElement' does not contain a definition for 'LoginName'"} System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException} 而 在Net 4.5版本版本下不会报错,使用正常。报错代码如下: #...

xiaomai4343的博客 6807

SAP 集成泛微 OA Open API 新建流程申请接口

《SAP ERP 与泛微 OA 的系统集成》系列文章。泛微 Open API 是基于 HTTPS 的 Restful 接口,上篇文章,我已经完成了调用业务接口之前的准备工作,这篇文章我以新建流程申请这个系统集成最重要的接口为例,讲解接口设计、泛微 API 调用的过程、遇到的问题、解决的办法。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 3555

.Net 4.0 之 Dynamic 动态类型

        本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持。       一、.net4.0主要新特性         .Net4.0在.Net3.5基础上新增的主要特性有:可选参数、命名参数和Dynamic。具体请阅生鱼片的这篇博文。这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下。总之.Net在不断进...

weixin_34309543的博客 251

硬件描述语言Verilog学习(一)

主要学习综合和仿真、模块结构和信号类型Verilog 是用代码的形式描述硬件的功能,最终在硬件电路上实现该功能。在 Verilog 描述出硬件功能后需要使用综合器对 Verilog 代码进行解释并将代码转化成实际的电路来表示,最终产生实际的电路,也被称为网表。这种将 Verilog 代码转成网表的工具就是综合器。 上图左上角是一段 Verilog 代码,该代码实现了一个加法器的功能。在经过综合器解释后该代码被转化成一个加法器电路。QUARTUS、ISE 和 VIVADO 等 FPGA 开发工具都是综合器,

安静到无声 1499

Python爬虫实战:高效爬取Vimeo高清视频

在当今数字化时代,视频内容已成为互联网的重要组成部分。Vimeo作为一个高质量的视频分享平台,拥有大量优质视频资源。然而,Vimeo并未提供直接下载视频的选项,因此,我们需要借助Python爬虫技术来获取这些高清视频。(HTTP Live Streaming)格式存储。Vimeo的视频通常不会直接暴露。Vimeo的视频通常以。

2201_76125261的博客 429

C#4.0新特性之(一)动态查找

 C#4.0新特性之(一)动态查找     在大神Anders的领导下,C#这门语言也越来越快地朝着编程语言宇宙第一神器进化,C#4.0的新特征都是围绕“动态”(dynamic)的概念的,本文我们先来看看第一个新特性:动态查找(Dynamic Lookup)。 1.初识dynamic 动态查找允许动态(即在运行时)实现对某个对象的操作与对象类型的绑定,而不管这个对象是来自COM,IronP...

weixin_34130389的博客 166

rk3588 适配以太网(百兆)

虽然 RK3588 的 GMAC 控制器原生支持千兆速率(10/100/1000 Mbps),但在某些工业控制、物联网网关或成本敏感型硬件设计中,开发者会选择将其配置为 百兆以太网(Fast Ethernet) 模式。

weixin_35723192的博客 218

C#4.0 的新特性 所见闻

king963741的专栏 559

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C#4.0和VS2010新特性

http://www.cnblogs.com/serviceboy/archive/2010/04/14/1711838.htmlC#4.0和VS2010新特性(一)<br />VS2010被认为将是续写Visual Studio 6 的扛鼎之作。整个IDE不仅是使用了WPF重构,而且使用了最新的NET Framework 4作为强大的后援支撑。从上至下可圈可点。下面我们就来看一看VS2010在哪些方面引人注目——<br /> <br />1)WPF重构界面:整个VS2010 IDE全部使用WPF重构,因此

Sky_666的专栏 1002

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# 4.0的一些新特性

vs2010正式版4月12日发布了,前几天我也下了一个,但这几天都没有时间好好试用一下,今天针对C#语言的新特性使用了一下,感觉还不错,有几个新特性和大家分享一下,希望我没有太火星…… 一、新关键词——dynamic 在新版本的C#中,dynamic关键词是一个很重要的新特性,现在你可以创建动态对象并在运行时再决定它的类型。而且.net 4.0为CLR加入了一组为动态语言服务的运行时环境,...

tansitongba 99

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

weixin_33973600的博客 89

C# 4.0四大新特性代码示例与解读

C# 4.0四大新特性代码示例与解读 摘要:今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。   之前的文章中,我们曾介绍过C#的历史及C#4.0新增特性,包括:dynamic、 命名和可选参数、动态导入以及协变和逆变等。今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性。   1.dynamic ExpandoObject   熟悉js的...

weixin_34272308的博客 74

C#--学习笔记

一、《C#学习笔记》 目录:C06 接口(interface) C08 委托(delegate) C09 事件(Event) C10 类型 C11 泛型(Generic)--使类型参数化 C12 可空类型、匿名方法和迭代器 C14 Lambda表达式 C15 扩展方法--使类的扩展更简单:(Extension Me...

jiemoxiangcha的博客 428

c#4.0新特性之一: Dynamic Lookup (2)

我们分析一下用Reflector看到的东西:Code 1private static void Main(string[] args) 2{ 3    object foo1 = new Foo(); 4    if (Main>o__SiteContainer0.p__Site1 == null) 5    { 6        Main>o__SiteContainer0.p__Site1

维生素C.net 2033

C#4.0新特性

本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言:   终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善——Com 互操作性的改进和动态类型的引入,然而COM互操作性这里就不详细介绍的,对于.Net 互操作性我将会在另外一个专题中详细和大家分享下我所了解到的知识,本专题就和大家分享C# 4中的动态类型,对于动态类...

李小砍的技术博客 1355

C# 4.0 新特性-dynamic

前段时间看过一些关于dynamic这个C#4中的新特性,看到有些朋友认为dynamic的弊大于利,如无法使用编译器智能提示,无法在编译时做静态类型检查,性能差等等。因此在这篇文章中我将就这些问题来对dynamic做一个较详细的介绍,希望通过这篇文章,能使大家对dynamic关键字有个更深入的认识。 dynamic介绍 相信很多人应该都已经对Anders Hejlsberg在PDC20...

a726822058479123的博客 422

asp.net Html Dynamic,.NET 4.0 之 Dynamic 动态类型

一、.NET4.0主要新特性.NET4.0在.Net3.5基础上新增的主要特性有:可选参数、命名参数和Dynamic。具体请阅生鱼片的这篇博文。这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下。总之.Net在不断进步中。二、ExpandoObject普通应用ExpandoObject 类,“需引用System.Dynamic命名空间” 。请看以下代码:d...

weixin_39887748的博客 267
上一篇: C# ?、?? 问号和2个问号的用法(类型?、对象?)
下一篇: C# 数组拆分
DayDay_Code
博客等级 码龄14年 31粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值