您的位置:首页 > 其它

深入了解Dynamic & DLR(二)

2011-09-23 11:33 253 查看
在上一篇随笔深入了解Dynamic & DLR(一)主要谈到在面向服务设计中,动态编程的必要性,并深入了解下dynamic这个关键字,以及它是如何在利用C#这门静态语言实现动态功能的。紧接上篇,一起来探讨下DLR ScripRuntime和两个常用类DynamicObject 和 ExpandoObject。

2.DLR ScriptRuntime

DLR(Dynamic Language Runtime),是微软的一个开源项目。为.NET应用程序提供了动态脚本注入技持。DLR构建的功能包含两个方面,一个是共享的动态类型系统,一个是标准的承载模型。但是VS2010并没有集成相关dll,大家可以从Codeplex获得源码,目前最新版本为1.0。这里不得不提到CLR,它是整个运行环境的基础,DLR也是运行在其之上的,这样是有显而易见的好处的,CLR的垃圾回收、JIT编译、安全模型,DLR也能享用这些底层架构功能,如果我们对垃圾回收进行优化,或者是提供某种功能,那么DLR相应的也能享用这种便利。DLR内部为了提高执行效率,会从自己先compile script,然后cache。有些类似JIT机制。避免重复加载,解析外部脚本。

在实际业务逻辑中,我们希望能够实时动态执行存储在文件中的代码或者完整一个业务逻辑功能,甚至我们可以动态选择脚本语言引擎,在应用程序域中动态生成脚本,并注入脚本,来达到控制业务逻辑的目的。在随笔一,我列举了一个场景,需要随意调整销售策略在所有POS机上,假设我们根据客户等级来进行折扣,VIP客户8折,荣誉客户9折,一般客户9.8折,并且金额达到5000时,再能进行9.8的折扣。UI我们假设使用winform。界面如下。

View Code

static void Main(string[] args)
{
dynamic user = new DynamicUser();
user.NickName = "Loong";
Console.WriteLine(user.GetType());
Console.WriteLine(user.NickName);

Func<string, string> GetWelcomeMsg = name => string.Format("welcome {0}", name);
user.GetMsg = GetWelcomeMsg;
Console.WriteLine(user.GetMsg("Loong"));

Console.ReadLine();
}


执行结果如下:



ExpandoObject的工作方式类似,不必重写方法。

dynamic expUser = new ExpandoObject();
expUser.NickName = "loong2";
Console.WriteLine(expUser.GetType());
Console.WriteLine(expUser.NickName);

Func<string, string> GetWelcomeMsg = name => string.Format("welcome {0}", name);
expUser.GetMsg = GetWelcomeMsg;
Console.WriteLine(expUser.GetMsg("Loong"));


ExpandoObject使用上和dynamic没什么区别, 有一点区别是不能仅仅是创建dynamic对象,而不去初始化它。创建dynamic的同时必须初始化它。另外ExpandoObject的GetType方法总是显示System.Dynamic.ExpandoObject.而DynamicObject则显示继承类的type。一般来说dynamic和ExpandoObject就可以满足我们的需要, 如果需要准确控制对象的binding,可以尝试使用DynamicObject,重写GET、SET方法来满足自己的需要。

以上是个人对Dynamic和DLR的一些认识和学习。欢迎各位童鞋互相探讨。

文章首发站点:www.agilesharp.com IT创业产品互推平台
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: