.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.前不久看过这么一段代码:

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这段代码片段:

function tryInvokeMember(obj) {

             if (obj && typeof obj.ourMethod === "function") {

                 return obj.ourMethod();

             }

            alert('未找到!');

            return null;

         }

  

         var ourObj1 = {};

         ourObj1.Method = function () {

            alert('111');

         };

var ourObj2

= {};

         ourObj2.ourMethod = function () {

             alert('已经找到ourMethod并且执行');

         };

tryInvokeMember(ourObj1);
         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:

public class Duck : DynamicAnimal

     {

         public string Quack()

         {

            return "鸭子嘛,就Quack吧!";

         }

     }

  public class Human : DynamicAnimal

     {

         public string Talk()

         {

             return "人类是用Talk,而不是Quack";

         }

     }

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

public static string DoQuack(dynamic animal)

         {

             string result = animal.Quack();

             return result ?? "...人类当然不会鸭叫...";

         }

  4、Console 内 Main方法调用:

static void Main(string[] args)

         {

             var duck = new Duck();

             var cow = new Human();

             Console.WriteLine("鸭子是Quack");

             Console.WriteLine(DoQuack(duck));

             Console.WriteLine("人类是talk");

             Console.WriteLine(DoQuack(cow));

             Console.ReadKey();        

}

  程序执行结果如下:

  您是否对.Net4.0 Dynamic 这个动态类型有了一个新的认识呢?

时间: 2024-07-31 10:40:33

.NET 4.0 之 Dynamic 动态类型的相关文章

一起谈.NET技术,.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();Cus

.NET“.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();Cus

ASP.NET MVC 2.0 in Vs2010 :使用C# 4.0中使用动态类型来传递ViewData

如果是在使用C#4.0的话用户可以使用Dynamic的特性来动态访问模型中的属性,例如我们也像前面使用ViewData.Model一样传递一个实例,并且我们使用了如果代码在Action的View方法中传递User的一个实例: public ActionResult MyDynamicAction(){ var demo = new User { Name = "ZouJian", Age = 24 }; return View(demo); } 那么我们在视图中就可以调用如下代码: &

C# 4.0中的动态类型和动态编程

随着WEB开发的大行其道,各种动态语言也借着这股东风,蓬勃发展起来.在软件开发界,动态语言正 在被越来越多的的人所接受和使用,在CSDN所做的2007年读者大调查中,动态语言在开发人群中的受关注 程度竟然达到12%.而在 TIOBE的排名中,动态语言竟然占有了前十名中的六个席位(包括PHP.Python. Perl和 JavaScript,在加上越来越动态的Java和C#). "未来属于动态语言"似乎正在从一个预言成为一个现实.C#自然不会错过这种技术发展确实,她正 在通过不断引入新的

PB中dynamic调用类型的用法

说到DYNAMIC调用类型,我们先看看对象.属性.函数和事件的引用方法: PowerBuilder 6.0应用程序的开发过程实际上就是各种对象的定义和使用过程.所有对象都有名称,并通过名称相互区分.在PowerScript中,访问对象的属性.函数.事件的方法很简单,就是使用圆点作为标记符,具体来说,访问对象属性的格式为: 对象名.对象属性 例如,把单行编辑框sle_name的用户输入内容送到字符串变量UserEnter的语句可以写成: UserEnter=sle_name.Text 其中,sle

微型ORM——用VB和C#编写的动态类型ORM,只有160行

近来ORM变得越来越普遍,这都归于一种很具说服力的原因:它可以使开发数据库驱动的应用程序变得 更快.更省力.但是ORM框架都有点"固执己见",他们期望开发者遵从特定的规则,当规则被打破的时 候就非常难以使用.最通常的规则之一就是,存储过程必须总是返回单独的结果集,其中带有一致的列的 列表.不幸的是,有很多这样的存储过程,其中返回的数据的结果根据它自身内部逻辑的不同而不同.例 如,一个存储过程可能会接受一个参数,它表示要返回那些列,而另一个参数表示如果它包含了所有行, 那么就对其进行合计

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先安装一下Dapper(建议用nuget包来管理) 连接字符串: s

转 解析JDK 7的动态类型语言支持

Java虚拟机的字节码指令集的数量自从Sun公司的第一款Java虚拟机问世至JDK 7来临之前的十余年时间里,一直没有发生任何变化[1].随着JDK 7的发布,字节码指令集终于迎来了第一位新成员--invokedynamic指令.这条新增加的指令是JDK 7实现"动态类型语言(Dynamically Typed Language)"支持而进行的改进之一,也是为JDK 8可以顺利实现Lambda表达式做技术准备.在这篇文章中,我们将去了解JDK 7这项新特性的出现前因后果和它的意义. 动

终于知道C#的动态类型有什么用了。

问题描述 先看下面这个函数publicstaticTSum<T>(paramsT[]Args){Tsum=Args[0];for(inti=1;i<Args.Length;++i){sum+=Args[i];}returnsum;} 在C++中这是最最基本的函数模板,但是在C#中代码通不过,因为泛型不是模板,它不会生成多份代码,T是当做object来处理的,因此不能用来进行加法运算.但这样的加法泛型是非常有用的,最初的想法当然是使用泛型约束,然而不存在基本数据类型的一个基类或者借口,提供