C# 4.0 动态类型 初窥= =

之前遇到了一个难题,上头提示 可以用动态方法解决.. 可耻是4.0 这么久了。 从来没去看过。正好看看动态类型

直接来个简单例子

 1     public class dynamicTest
 2     {
 3         public dynamic i;
 4         public int GetArrLength()
 5         {
 6             return i.Split(',').Length;
 7         }
 8 
 9         public string[] GetArr()
10         { 
11             return i.Split(',');
12         }
13     }
1         protected void Page_Load(object sender, EventArgs e)
2         {
3             dynamicTest o = new dynamicTest();
4             o.i = "a,b,c,d";
5             Response.Write(o.GetArrLength());
6         }

 

页面上直接就输出4了, 之前完全没有定义 i 的类型.

dynamic 类型,绕过了编译类型的检查,在运行时解析.

 

OK 再进一步. 之前就是 一个String,这次自定义一个类

 1     public class StateMessage
 2     {
 3         public StateMessage(bool state, string text)
 4         {
 5             _state = state;
 6             _message = text;
 7         }
 8         private bool _state;
 9         private string _message;
10 
11         public bool state { get { return _state; } }
12         public string message { get { return _message; } }
13     }

 

改一下dynamicTest

public class dynamicTest
    {
        public dynamicTest() { }
        public dynamicTest(dynamic msg)
        {
            Message = msg;
        }

        public dynamic Message;
        public string[] GetArr()
        { 
            return i.Split(',');
        }

        public bool GetState {
            get {
                return Message.state;
            }
        }

        public string GetMessage
        {
            get {
                return Message.message;
            }
        }
    }
1         protected void Page_Load(object sender, EventArgs e)
2         {
4             dynamicTest o1 = new dynamicTest(new StateMessage(false, "测试"));
5             Response.Write(o1.GetMessage + "_____" + o1.GetState);
6         }

 

 

结果 测试_____False. 

使用.

dynamic 可以简化反射

 private void dynamicRun()
      {
          string filePath = @"D:\ScheduledJob\DLL\ScheduleJob.dll";
          string typeName = "ScheduleJob.DailyInfo";
          // string methodName = "SendDailyInfo";
          string methodArgs = "hello,this is dynamic Demo";

          try
          {
              //载入Assembly
              Assembly a = Assembly.LoadFrom(filePath);

              //应用dynamic自动实现反射
              dynamic o = a.CreateInstance(typeName, false, BindingFlags.CreateInstance, null, null, null, null);

              //这里直接写要执行的方法和参数
              o.SendDailyInfo(methodArgs);
          }
          catch (Exception ex)
          {
              Console.WriteLine("Cannot run dynamic " + ex.InnerException);
          }
      }

 

还有就是 

    有时你又需要一些特定类型的行为特性来完成你的逻辑,而这个特定类型又不完全被你所掌握. 就可以使用.

当然这种动态类型,带来了很多好玩的写法.

 

不过在使用的时候 又不得不担心效率问题. 其实感觉就像是在写Object, 每一处dynamic 都是一处强转

用Reflector 看了下

 1 public class dynamicTest
 2 {
 3     // Fields
 4     [Dynamic]
 5     public object i;
 6     [Dynamic]
 7     public object Message;
 8 
 9     // Methods
10     public dynamicTest()
11     {
12     }
13 
14     public dynamicTest([Dynamic] object msg)
15     {
16         this.Message = msg;
17     }
18 
19     public string[] GetArr()
20     {
21         return (string[]) ((dynamic) this.i).Split(',');
22     }
23 
24     public int GetArrLength()
25     {
26         return (int) ((dynamic) this.i).Split(',').Length;
27     }
28 
29     // Properties
30     public string GetMessage
31     {
32         get
33         {
34             return (string) ((dynamic) this.Message).message;
35         }
36     }
37 
38     public bool GetState
39     {
40         get
41         {
42             return (bool) ((dynamic) this.Message).state;
43         }
44     }
45 }
46 
47  

 

果然是 object, 然后你要输出的时候强转一次.  突然觉得性能堪忧啊. 而且有点儿语法糖的感觉了.. 并不像之前所说的是一种类型

 

性能测试

http://www.cnblogs.com/downmoon/archive/2008/09/01/1281118.html

在vs2005环境下,从Reader流转化为List<T>或IList<T>时,Reflect方法效率最低,DynamicMethod次之,但性能与Manual方法相当接近,综合而言, DynamicMethod代码量小,移植性好,性能相对也不错,值得推荐!

最主要的是:当Entity的属性值个数大于Reader的Column个数时,Reflect和DynamicMethod性能更佳,且不会报错!换言之,当你需取表中的某几个字段时,DynamicMwthod的优势是显而易见的!

 

机制. 由于还要连带查看DLR......

等待补充吧~

 

现在给我的感觉是就像一个语法糖,  性能一般(针对反射来说还是很好的,相比其他静态类型肯定还是要差上不少), 主要是由于在 DLR 中有缓存优化.

胜在代码量小,移植性好.

但是由于是动态的,可读性也差了不少

 

PS:参考资料

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

http://www.cnblogs.com/ryanding/archive/2010/12/14/1905426.html //文章测试不怎么样。评论很赞

http://www.cnblogs.com/downmoon/archive/2008/09/01/1281118.html

http://www.cnblogs.com/Ivan-Yan/archive/2011/02/13/1953044.html

posted @ 2012-07-03 23:11  CallMeTommy  阅读(1617)  评论(0编辑  收藏  举报