C#基本语法 - .Net 4.0 之 Dynamic 动态类型
一、.net4.0主要新特性
.Net4.0在.Net3.5基础上新增的主要特性有:可选参数、命名参数和Dynamic。具体请阅生鱼片的这篇博文。这里我们着重讲解C#4.0的Dynamic特性,对于其他特性大家可以在VS2010内尝试一下。总之.Net在不断进步中。
二、ExpandoObject普通应用
ExpandoObject 类,“需引用System.Dynamic命名空间” 。请看以下代码:
dynamic Customer = new ExpandoObject();
Customer.Name = "Lucy";
Customer.Age = 20;
Customer.Female = true;
Console.WriteLine(Customer.Name + Customer.Age + Customer.Female);
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 }
程序执行结果如下:

您是否对.Net4.0 Dynamic 这个动态类型有了一个新的认识呢?
最后希望本篇文章可以给您带来帮助,如有不足之处欢迎指出,谢谢!
作者:RyanDing
出处:http://www.cnblogs.com/ryanding/
C#基本语法 - .Net 4.0 之 Dynamic 动态类型的更多相关文章
- Net 4.0 之 Dynamic 动态类型
Net 4.0 之 Dynamic 动态类型 本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持. 一..net4.0主要新特性 .Net4.0在.Net3.5 ...
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- C#4.0使用dynamic 动态添加属性
最近做一个项目,用wpf mvvm实现,而前台表格需要根据数据库某表的设置不同生成不同的列名.过去用winform和Ado.net实现这种功能的时候就只需要拼装DataTable,拼成最后需要的表格, ...
- Json.net实现方便的Json转C#(dynamic动态类型)对象
以前需要将一段json字符串转换为C#对象时,一般都是定义一个与之对应的实体类来接收.这样做有一个很大的缺点,就是当字符串特别长,属性特别多,又有嵌套时,手敲这个实体类就非常痛苦. 比如之前做的一个接 ...
- C# 4.0中的动态类型和动态编程
# 4.0的主题就是动态编程(Dynamic Programming).虽然C#仍然是一种静态语言,但是对象的意义开始变得越来越“动态”.它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程 ...
- c# dynamic动态类型和匿名类
dynamic类型 简单示例 dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写 expando.Id = 1; e ...
- dynamic动态类型的扩展方法
对于一个动态类型来说,你可以认为它包含任意成员,它们都能通过编译.但到了运行时,到底是否拥有这些成员,就真相大白了.如 dynamic test = ; Console.Write(test.Name ...
- MessagePack Java 0.6.X 动态类型
我们知道 Java 是一个静态类型的语言.通过输入 Value MessagePack能够实现动态的特性. Value 有方法来检查自己的类型(isIntegerType(), isArrayType ...
- L脚本语言语法手冊 0.10版
L脚本语言语法手冊 0.10版 简 介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,眼下支持在中文.英文基础上的编程.并可扩展为随意语种.L脚本语言的语法结构简单.程序结构相对 ...
随机推荐
- 两款Mongodb可视化工具
在某些场景下,相比传统的关系数据库和NoSQL数据库,Mongodb拥有不可替代的优势. 例如,最近我需要为收集的大量网站进行分类.实际情况是,一个网站可能同时有多个标签,想象一下新浪网,它既是门户站 ...
- leetcode 213. 打家劫舍 II JAVA
题目: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻 ...
- Python2和Python3共存,pip共存
使用python开发,环境有Python2和 python3 两种,有时候需要两种环境切换使用,下面提供详细教程一份. 1.下载python3和python2 进入python官网,链接https:/ ...
- 「案例」重新设计 Adobe 的文件类型图标
Adobe 的品牌设计团队负责为公司旗下桌面端.移动端和 web 端的产品进行品牌设计.品牌元素的形式很多,可以是两个字母的产品 logo,应用启动界面,产品里的图标等等. 一个很常见却常被忽视的品牌 ...
- ARC初步介绍
[转载自 http://onevcat.com/2012/06/arc-hand-by-hand/] 手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objecti ...
- np.random.normal()
高斯分布(Gaussian Distribution)的概率密度函数(probability density function): \[ f(x)=\frac1{\sqrt{2\pi}\sigma}\ ...
- c++primer plus笔记
> 第六版 操作符重载 #include<iostream> using namespace std; class Time { public: Time() { h=m=0; } ...
- [USACO19FEB]Cow Dating
Luogu5242 通过观察数据,我们可以发现,右端点的取值是单调递增的.于是,我们可以极限一波,用一个双指针法,类似于队列. 右端点的取值满足以下公式: (1-p1)(1-p2)..(1-pn) * ...
- python 元类以及练习
''' # 知识储备exec() # 参数1:字符串形式的命令 # 参数2:全局作用域(字典形式),如果不指定默认就使用globals() # 参数3:局部作用域(字典形式),如果不指定默认就使用lo ...
- 设置第三方的SMTP服务
取得授权码: