C#4.0中的dynamic关键字和ExpandoObject对象
我们做Web应用程序开发的程序员,我想大家对JavaScript的接触一定不少,在JavaScript中我们经常用到一个功能,就是可以随时随地的新建一个对象,然后就可以自定义的给它定义自己需要的属性,就如下面的简单例子
<script type="text/javascript">
function getObject(name) {
var obj = new Object();
//自定义两个属性
obj.Name = name;
obj.Sex = "男";
return obj;
}
function onbtnClick() {
var retobj = getObject("吖龙");//调用自定义的属性
alert("姓名:"+retobj.Name + " 性别:" + retobj.Sex);
}
</script>
用下面代码调用
<input type="button" id="btnTest" value="自定义属性" onclick="onbtnClick();" />
单击自定义属性按钮后,会像我们意料的一样获取到了相应的自定义属性值。
曾经,我为上面的方便用法疯狂和兴奋过,这几天看到了C#4.0也提供了这种用法,更是兴奋不已,获取你已经觉得早就已经熟运于心了,请原谅我的反应迟钝和步伐慢。今天怀着分享的心给简单介绍一下C#4.0中的关键字dynamic和对象ExpendoObject对象。
我的类型,我做主,编译器绕道过···
dynamic最大的特点我想莫过于在它的类型在运行时才确定,这也是它与往静态类型关键字的最大区别。如果你在你的代码操作中用到了dynamic关键字去定义一个变量时,那么这个变量在编译的时候编译器不会对它进行类型检查,允许它到运行的时候再做解释。在大多数情况下,dynamic 类型与 object 类型的行为是一样的。但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查,只是将有关该变量编译到类型 object 的变量中以及有关它的操作信息打包在一起,在运行时再解释运行。像下面的代码:
dynamic objDynamic = objDynamic + 1;//编译通过
object objObject = objObject + 1;//编译不通过
原因就是编译器不对dynamic进行类型的检查,这也是两者最大的区别。
dynamic关键字可以用于很多情况,比如在声明中,作为属性、字段、索引器、参数、返回值或类型约束的类型等等,用法和其他基本类型的关键字很类似,更详细可以看Dynamic(C#参考)
为了实现一个像上面JavaScript中的功能,在C#4.0中新添加了一个ExpandoObject对象,它位于程序集: System.Core(在 System.Core.dll 中)命名空间: System.Dynamic 中,他的用法和我上面举得JavaScript的用法很类似,下面偷懒一下,借用用msdn的一个例子:
上一个:用C#读写文件的方法
下一个:C#实现一个简单的HTTP服务器