C#4.0中的dynamic关键字和ExpandoObject对象

来源:互联网 发布:华为实力到底如何知乎 编辑:程序博客网 时间:2024/05/20 05:46

我们做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 + "\n性别:" + 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的一个例子:

 

  

  

 

代码
static void Main(string[] args)
{
dynamic employee, manager;

employee
= new ExpandoObject();//配合dynamic创建一个ExpandoObject对象
    //给这个对象自定义一些属性
employee.Name
= "John Smith";
employee.Age
= 33;

manager
= new ExpandoObject();
manager.Name
= "Allison Brown";
manager.Age
= 42;
manager.TeamSize
= 10;

WritePerson(manager);
WritePerson(employee);
}
private static void WritePerson(dynamic person)
{
Console.WriteLine(
"{0} is {1} years old.",
person.Name, person.Age);//调用属性
// The following statement causes an exception
// if you pass the employee object.
// Console.WriteLine("Manages {0} people", person.TeamSize);
}
//输出"John Smith is 33 years old.";
//输出"Allison Brown is 10 years old.";

 

 

和JavaScript中的用法十分类似,从今以后,在像要序列化一些信息返回客户端等简单传值的情况下,我们也可以像JavaScript一样很方便的使用这种方法了,由于很少写文章,加上知识浅薄,文章写得乱成一团,希望大家原谅,这篇文章只是起到抛砖引玉的作用,更多的信息可以查看MSDN的技术文档ExpandoObject 类dynamic(C# 参考)

原创粉丝点击