ASP.NET MVC有没有用过?
ViewBag就是一个dynamic类型的变量,你可以用它放入任何属性/值,没有dynamic,而用object,就只能反射了。
最近很热门的SignalR有没有用过?
它的服务器端的代码:Clients就是一个dynamic类型,你在客户端只需要定义了函数原型,不需要把这个函数原型在服务器上再写一次。你可以用Clients.All.任意的函数名(任意个函数/函数参数)就可以调用了。
LINQ有没有用过?有时候我们需要返回动态查询,此时我们没有定义实体类型,怎么接收查询的结果呢?还得靠synamic……

解决方案 »

  1.   

     Visual C# 2010 引入了一个新类型 dynamic。 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。 在编译时,将假定类型化为 dynamic 的元素支持任何操作。这里不和楼主讲C#的 和楼主将js的~ js的哲学是佛学,就是你把他当做什么那么他就是什么~
    伪JS代码
    class Frog{};//青蛙,我们定义了一个类~,但里面什么都没有定义~
    var f=new Frog();//实例化一个变量接下来开始体会js的变态吧~
    我觉得青蛙应该可以游泳吧~ 所以
    Frog.Protey.Swim=function (){};我觉得有些青蛙有尾巴吧~所以
    f.HasTail; // 这个变态了吧~在C#这种强类型语言中~,如果没有在类中定义了~那么实例化成员是不会有的~
    但js很随便而C#的dynamic 就是慢慢地向js这种弱类型语言靠近~书没有 你可以搜索
      

  2.   

    忘记解释微软官方的话了
    Visual C# 2010 引入了一个新类型 dynamic。 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。 在编译时,将假定类型化为 dynamic 的元素支持任何操作。class Frog{};
    var f=new Frog();
    f.HasTail; // 如果是C# 这里编译的时候是不会通过的~但如果使用dynamic 那么是可以通过的~ 但运行的时候会报错~ js不会报错~ 而且还是可以运行的~是真的 就是你把他当做什么那么他就是什么~
    而dynamic 目前只是提供一种语法上的方便而已~
      

  3.   

    其实dynamic也不是动态编程。静态语言不能像动态语言那样随便可以给一个类加一个属性或字段,或一个方法。dynamic的对象一经定义,其实也还是一个强类型,只不过编译器“不知道”罢了。但CLR知道。因为你对dynamic对象的一个不存在的属性进行操作就会报错。
      

  4.   

    2L说的其实是原型。一种C#程序员比较陌生的范式。
    在C#中,我们在编译的时候确定一个类型,比如
    class A
    {
        public int i = 1;
        public virtual void foo() { Console.WriteLine("HelloWorld"); }
    }
    我们实例化一个对象:
    A a = new A();
    a.i = 2;
    a.foo();
    可见,对象是类型的实例,类型是对象产生的模板。
    在原型范式中,我们不需要类型,我们用对象作为类型:
    dynamic A = new ExpendroObject();
    A.new = new Func<dynamic>(() =>
    {
        dynamic obj = ExpendroObject();
        obj.i = 1;
        obj.foo = new Action(() => {
            Console.WriteLine("HelloWorld");
        });
        return obj;
    });
    我们可以这么使用:
    dynamic a = A.new();
    a.i = 2;
    a.foo();
    在C#中,我们继承是这样的:
    class B : A
    {
        public int j = 1;
        public override void foo() { }
    };
    在原型范式中,我们可以这么做:
    dynamic B = new ExpendroObject();
    B.new = Func<dynamic>(() => 
    {
        dynamic obj = A.new();
        obj.j = 1;
        obj.foo = new Action(() => {  });
        return obj;
    });
    这样,我们保留了继承来的i,新增了j,同时重写了foo();
      

  5.   

    你做一下office的com对象就知道有啥用了
      

  6.   

    省得你以为“反射是什么高端”的了,这回写程序简单多了。不过如果用不好,就跟javascript程序一样烂了。所以仅仅在必须的时候才应该使用。
      

  7.   

    在访问 Office 对象过程中,会尽量使用 Microsoft.Office.Interop.XXXX 类库,追求强类型编程。能够避开 dynamic 的就应该避开。以保证你在编程时就能及时看到各种输入提示,编译时就能发现大量编程错误,在测试运行的第一遍就能发现数据错误(而不是反复到50遍当数据类型突变时在用户面前崩溃)。使用 dynamic 不超过0.1%(千分之一)。多用dynamic是自己“找罪受”,或者闭着眼睛瞎猜地去编程。那些“动态语言”许多都被大多数程序员从心里排斥用它进行大规模正规开发,觉得它很“烂”,就是因为宣传“动态”太“过”了。而c#中很谨慎地加入了dynamic,让你不用费劲写许多反射代码了!但是你仍然要知道反射的危害,因此仅在必要的两三个地方使用它即可。
      

  8.   

    比如说你在console程序中写var xx = new ProcessStartInfo
    {
        Arguments = "1234",
        FileName = "notpad.exe"
    };
    dynamic yy = xx;
    Console.WriteLine(yy.Arguments);
    Console.WriteLine(yy.FullName);
    这个针对yy的第一个输出,在运行时就正确执行力,而第二个就会让程序崩溃。但是加入我们写var xx = new ProcessStartInfo
    {
        Arguments = "1234",
        FileName = "notpad.exe"
    };
    var zz = new DirectoryInfo("c:");
    dynamic yy = xx;
    Console.WriteLine(yy.Arguments);
    yy = zz;
    Console.WriteLine(yy.FullName);这就通过了。实际上如果你真正动脑筋去“设计程序”,多测试正规的程序,你一定感觉能够在编译时就进行检测的强类型语言是多么优美和高效。而不会反过来以为以低级诡异为美的所谓“动态”语言才高效。
      

  9.   

    http://msdn.microsoft.com/zh-cn/library/dd264736.aspx
      

  10.   

    msdn是告诉你一些底层接口知识的,是api列表,不是负责跟你讲明白该如何做的。这就好像农村周边的卖肥料的商店也会负责让你逐一阅读肥料包装袋上的说明书,但是真正的“大户”还是有自己的使用肥料的经验和知识。而这个dynamic,恰好就需要这类讨论才能明白。而看msdn肯定会一头雾水。
      

  11.   

    有些人因为滥用反射,好像不用反射的人就比他的技术差似地。这时候就会写出诡异的、无法再编译期检查、在运行时也几乎无法调试的程序。这个时候,我们就需要用正规的“面向接口设计”来取代反射,杜绝成事不足败事有余的AOP习惯。对于dynamic也是一样。dynamic把非常好的反射类库封装为如此舒服、自然、简洁的语法形式,非常好!但是还是不要滥用。