上面代码看了很久,没看出有什么特别之处呀,与调用接口一样吧。
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
public class Coffee 

public string GetName() 

return "You selected Maxwell coffee."; 


public class Juice 

public string GetName() 

return "You selected orange juice."; 


namespace ConsoleApplication1 

class Program 

static private Object GetDrink(int i) 

if (i == 1) 

  return new Juice(); 

else // default 

  return new Coffee(); 


static void Main(string[] args) 

Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee"); 
int nDrinkType = Console.Read(); 
dynamic drink = GetDrink(nDrinkType); 
Console.WriteLine(drink.GetName()); 
Console.ReadLine(); 
Console.ReadLine(); 



C#编译器允许你通过dynamic对象调用任何方法,即使这个方法根本不存在,编译器也不会在编译的时候报编译错误。只有在运行的时候,它才会检查这个对象的实际类型,并检查在它上面GetName()是什么意思。动态类型将使得C#可以以更加统一而便利的形式范围下列对象: 来自动态编程语言——如Python或Ruby——的对象 
通过IDispatch访问的COM对象 
通过反射访问的一般.NET类型 
结构发生过变化的对象——如HTML DOM对象 
当我们得到一个动态类型的对象时,不管它是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,动态语言运行时(DLR)会帮我们指出针对特定的对象,这些操作的具体意义。这将给我们的开发带来极大的灵活性,并且能够极大程度上地精简我们的代码。 

解决方案 »

  1.   

    谢谢wuyazhe,还有其它表达么? 每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
      

  2.   

    @楼上,
    是 .net4 的最新特点。应该是动态加载,像反射一样。
    (晕,这么一解释差不多都把问题给解决了)
      

  3.   

    oj写了这文章。等他来解释下。哈。
    就个人的见解,已经1楼写过了。就是为了增加代码可读性,局部的一个类型而已。其实也就是个语法糖。.net的每一次升级都会给我们很多语法糖,语法糖的好处就是让代码整洁,思路清晰,你一定要追究确切的存在意义,其实并没有,你用vs2005(不推荐2003是因为foreach对值类型装箱拆箱的效率影响)也一样能写的很漂亮。不过有些个别情况。就会有点丑陋。语法糖遍布我们的编程过程。例如正则中的(?n)模式。
    (?:aa|bb)(?:aa|bb)(?:aa|bb)(?:aa|bb)如果我不需要分组,只想分块,我就可以这样写,但是累赘
    这样一个表达式,可以用(?n)标记出来变为
    (?n)(aa|bb)(aa|bb)(aa|bb)(aa|bb)
    以上2个表达式等效,效率都一样。所以我认为的就是一个编码的优化,提高可读性的。
    其实没有哪个情况必须用这个的。不过你可以继续挂着这个帖子。等高人进来给你分析一下什么情况,用这个动态类型是能很好的减少代码量。
      

  4.   

    除非那种“意译”已经被广泛接受,否则dymnamic就是dynamic,一定要注意不要轻易自作主张改名叫做“动态编程”,否则误人也误己。
      

  5.   

    至少对于我并不需要解释什么,如果你有时间看看十几年前的强大的vb,直到1998年前都一直很自然地使用者“后期绑定”机制,是vb程序员快速开发的编程利器,只是在.net时期才失去了这个机制。.net取消这个也有它的道理,就是初级程序员常常争论的“效率”。.net没有包括vb赖以成功的一个机制,有它的道理。现在又号称重新发明了这种方便的语法,也有它的道理。反正微软总有它的道理——不过我倒是觉得.net确实需要再注重找回17年前vb给windows编程带来的那种能力,让非专业程序员也方便地反射编程(尽管这意味着许多新的流行的产品的代码更乱更不够“经典”)。
      

  6.   

    一起看看学vb(vb.net之前版本)是怎么使用这种机制的:http://www.google.com.hk/search?q=vb+%E5%90%8E%E6%9C%9F%E7%BB%91%E5%AE%9A&rls=com.microsoft:zh-cn:IE-SearchBox&ie=UTF-8&oe=UTF-8&sourceid=ie7
      

  7.   

    sp1234大神…
    vb的晚绑定,.net下不是用object的转换或装箱拆箱,或是 隐式类型var 可以实现类似的效果么。
      

  8.   

    匿名对象 用完就扔 不想起个名字
    匿名函数 用完就扔 不想起个名字
    动态类型 用完就扔 不想起个文件(类型 是数据的一种组织方式,我临时定义数据的组织)关于动态类型 <悟透javascript> 用佛学来讲  讲的非常不错的说
      

  9.   

    //真是粗心,纠正楼下代码:
    with(myBll.GetInfo())
    {
      Consol.WriteLine(.Code);
    }
      

  10.   

    @楼上的楼上,
    说起匿名,真搞不懂C#为什么要把with丢掉。
    如下多方便呀:with(myBll.GetList())
    {
      Consol.WriteLine(.Code);
    }

    //我现在用了很多ni名函数,目前可能在滥用之中,就像当时刚引入继承时,一个简单的界面整出十层一样。
    //现在一个窗体最多继承三层,如要新增相近的窗体,直接复制。
    //用ni名函数把事件定义放在窗体的构造函数里,这样硬写事件定义就不怕事件在控件的复制过程中丢失了。
    btnSelCd.Click += new System.EventHandler(delegate(object sender, EventArgs e) //选择产品
    {
        SelItm f = new SelItm();
        f.CreateParam = string.Format("CD:{0}", txtCd.Text); //参数,当然也可以f.txtCd.Text = this.txtCd.Text (Modifier改为public)
        if (f.ShowDialog() == DialogResult.OK)
        {
            txtCd.Text = f.tGetValue();
            with(f.GetValues()) //X
            {
                 txtDescription.Text = .Dscr; //X
                 txtUnit.Text = .Unit; //X
            }
        }
        f.Dispose();
        
        //
        using new SelItm()
        {
           //add code here
        }});
      

  11.   

    //粗心加粗心,纠正15、16楼(把颜色标记写成代码标记了)
    with(myBll.GetInfo())
    {
      Consol.WriteLine(.Code);
    }//老是这样或那样的粗心,在电脑面前一直碰壁,每次写的代码都不自信,要时不时地运行调试,基本上的时间都耗在调试上了。像我这种人去开车,在开车之前一定要先按下保存,以防万一。