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) { func<string, string, string> getfullname = (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<string, object> dynamicdata = new dictionary<string, object>(); 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#高级编程 第十二章 动态语言扩展 的详细内容。
