C#的动态类型ExpandoObject和DynamicObject

来源:互联网 发布:2016最近网络最火的dj 编辑:程序博客网 时间:2024/05/19 03:43
一、ExpandoObject类型
     ExpandoObject表示一个对象,该对象包含可在运行时动态添加和移除的成员.这个类和动态类型有关,这个类能做些什么?
学过javascript的都知道,javascript里面有动态属性这个说法,现在C#里面同样有,具体的做法如下:
在使用这个类型之前,需要引入命名空间using System.Dynamic;

            dynamic obj = new ExpandoObject();
            obj.name = "菲菲";
            obj.sex = "女";
            obj.age = 24;
            obj.method = new Func<int, int, int>((a,b)=> { return a * b; });                   //添加动态方法
            Console.WriteLine($"{obj.name}  {obj.sex}  {obj.age}  {obj.method(100,200)}");
在上面的代码中,dynamic相当于javascript中的var ,只是添加动态方法的时候有点区别,
javascript如下
           obj.method=function(a,b){ return a*b;}
而在C#中由于函数本身并不是对象,但是我们可以通过“委托”去完成。如下:
          obj.method = new Func<int, int, int>((a,b)=> { return a * b; });                   //添加动态方法
ExpandoObject这个类还是很有用的,他可以动态的添加成员和方法,这样我们就可以在写一些对象时,不需要在new一个class那么麻烦,只要这个类就OK,
不过有一点要注意,这个类时在运行时解析的,这样我们就会带来性能上的一些损失,而且,程序的逻辑复杂性越高,越难发现问题所在,所以,对于简单的对象,
我们可以使用这个类,复杂的就不要使用了。

二、另外还有几个重要的类型和接口

如下所示:

DynamicMetaObject
DynamicMetaObjectBinder
DynamicObject
IDynamicMetaObjectProvider
由于这些类使用比较少而且比较复杂,这里暂不做讨论,可以参见C#4.0的文档。
0 0
原创粉丝点击