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 + " \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# 参考)
 

你可能感兴趣的:(dynamic)