一起谈.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();
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-12-31 19:32:24

一起谈.NET技术,.NET 4.0 之 Dynamic 动态类型的相关文章

.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(); Cu

.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技术,.NET4.0 之 Dynamic VS Reflection 效率

在我先前的文章中,不断的推广.NET4.0新特性.特别是.NET4.0 Dynamic 这个新特性.随之而来的问题也出现了-Dynamic 执行效率如何? 我们做开发的不光需要代码简洁,能够希望自己能够写出好的架构.还有一点非常重要的就是,我们的写出来的代码效率.撇开Dynamic在.net4.0中的实现原理.本篇只考虑dynamic 的效率比起使用反射到底是快还是慢?难道.NET为引入了dynamic这个新鲜事物降低了我们的程序效率?有网友指出评论一个特性或者方法的效率如何,唯一的判定标准就是

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); } 那么我们在视图中就可以调用如下代码: &

一起谈.NET技术,MVC2.0本地化(另类解决方案)&amp;lt;下&amp;gt;

本文是对MVC2.0本地化(另类解决方案)上这篇文章内介绍的MVC2.0本地化功能进行加强.细化的结尾篇.如果存在不足的地方,希望您指出. 如何对上篇文章进行加强以及细化呢?主要从以下三点开始. 1.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言. 2.多语言加入,类似resource文件,可以有多个语言资源库. 3.全局本地化,可以本地化非页面内容,比如为台异步到前台的json数据本地化等. 主要步骤如下: 一.根据用户浏览器自动语言判断,同时也可由用户自定义站点语言 这个实现思路为

一起谈.NET技术,.Net4.0 Parallel编程(一)Data Parallelism 上

Parallel.For 首先先写一个普通的循环: private void NormalFor(){for (var i = 0; i < 10000; i++) {for (var j = 0; j < 1000; j++) {for (var k = 0; k < 100; k++) { DoSomething(); } } }} 再看一个并行的For语句: private void ParallelFor(){ Parallel.For(0, 10000, i => {fo

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq增强查询

相关文章:NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询 系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHiber

一起谈.NET技术,.NET4.0的可扩展缓存系统

.NET Framework中,叫做System.Runtime.Caching,这不仅是个缓存库,还是个框架,可以在上面开发自己的库.ObjectCache定义了所有缓存都要实现的通用操作.与之搭配的是个内存缓存实现,叫做MemoryCache.这个缓存系统的结构如下: 上图大家可以看出来对应那些产品了吗? 下面我给大家介绍一个实现这样一个架构的代码示例,代码的核心就是ObjectCache,定义一个抽象的Provider接口: 1: public interface ICacheBuilde