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