C#中动态语言扩展的示例分析
这篇文章给大家分享的是有关C#中动态语言扩展的示例分析 的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于做网站、成都网站建设、米易网络推广、小程序开发、米易网络营销、米易企业策划、米易品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供米易建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
(一)DLR
C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分。DLR是添加到CLR的一系列服务。
(二)dynamic类型
dynamic类型允许编写忽略编译期间的类型检查的代码。编译器假定,给dynamic类型的对象定义的任何操作都是有效的,在运行之前编译器不会检测是否存在错误。
例子:
dynamic person = "人";string firstName = person.FirstName;
这两行代码能够通过编译器编译,但是点击运行后会报错:
需要注意的是,dynamic类型虽然很有用,但是它是有代价的。
(三)包含DLR ScriptRuntime
给应用程序添加脚本编辑功能,并给脚本传入数值和从脚本传出数值,是应用程序可以利用脚本完成工作。
(四)DynamicObject和ExpandoObject
从DynamicObject中派生或者使用ExpandoObject可以创建自己的动态对象。
使用DynamicObject派生创建动态对象,需要重写3个方法TrySetMembe()、TryGetMember()和TryInvokeMember()。
使用ExpandoObject与DynamicObject进行派生的区别在于不用重写方法。
例子:
class Program { static void Main(string[] args) { FuncgetFullName = (f, l) => { return f + " " + l; }; dynamic byexobj = new ExpandoObject(); byexobj.FirstName = "李"; byexobj.LastName = "四"; byexobj.GetFullName = getFullName; Console.WriteLine(byexobj.GetType()); Console.WriteLine(byexobj.GetFullName(byexobj.FirstName, byexobj.LastName)); Console.WriteLine("====================="); dynamic dyobj = new MyDynamicObject(); dyobj.FirstName = "张"; dyobj.LastName = "三"; dyobj.GetFullName = getFullName; Console.WriteLine(dyobj.GetType()); Console.WriteLine(dyobj.GetFullName(dyobj.FirstName, dyobj.LastName)); Console.ReadKey(); } } public class MyDynamicObject : DynamicObject { Dictionary dynamicData = new Dictionary (); public override bool TrySetMember(SetMemberBinder binder, object value) { dynamicData[binder.Name] = value; return true; } public override bool TryGetMember(GetMemberBinder binder, out object result) { bool success = false; result = null; if (dynamicData.ContainsKey(binder.Name)) { result = dynamicData[binder.Name]; success = true; } else { result = "未找到该属性的值"; success = false; } return success; } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { dynamic method = dynamicData[binder.Name]; result = method((string)args[0],(string)args[1]); return result != null; } }
运行以上代码,结果如下:
感谢各位的阅读!关于“C#中动态语言扩展的示例分析 ”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
文章名称:C#中动态语言扩展的示例分析
浏览路径:http://scyanting.com/article/ijojih.html