当前位置:首页 > Windows程序 > 正文

DynamicObject和ExpandoObject

2021-03-28 Windows程序

DynamicObjectExpandoObject

1.ExpandoObject表示一个对象,该对象包含可在运行时动态添加和移除的成员.这个类和动态类型有关,这个类能做些什么?

案例:

//ExpandoObject这个类需要引入System.Dynamic;

dynamic dynEO = new ExpandoObject();

dynEO.number = 20;

dynEO.Method = new Func<int, string>((int i) => { return (i + 20).ToString(); });

Console.WriteLine(dynEO.number);

Console.WriteLine(dynEO.Method(dynEO.number));

Console.ReadKey();

ExpandoObject这个累还是很有用的,他可以动态的添加成员和方法,这样我们就可以在写一些对象时,不需要在new一个class那么麻烦,只要这个类就OK,不过有一点要注意,这个类时在运行时解析的,这样我们就会带来性能上的一些损失,而且,程序的逻辑复杂性越高,越难发现问题所在,所以,对于简单的对象,我们可以使用这个类,复杂的就不要使用了.

2.DynamicObject

DynamicObjectExpandoObject最大的区别就是,我们可以通过继承DynamicObject,自己来决定动态对象如何执行.咱先来看一下DynamicObject的定义中初始化函数:

public class DynamicObject:IDynamicObjectProvider

{

protected DynamicObject();

}

可以看到的是我们不可以对DynamicObject直接实例化,这也是DynamicObject设计的初衷,有我们自己来决定运行时的动态的成员的处理.一般的时候如果我们自定义的类型只需要处理一些动态的属性的时候我们只需要重写TryGetMemberTrySetMember这两个方法.

using System;

using System.Collections.Generic;

using System.Dynamic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace DynamicExpando

{

class Program

{

static void Main(string[] args)

{

dynamic employee = new Test();

employee.Name = "zhangsan";

employee.Age = "22";

employee.Sex = "Man";

Console.WriteLine("name : {0} , age = {1} , sex = {2}",employee.Name,employee.Age,employee.Sex);

Console.ReadKey();

}

}

public class Test : DynamicObject

{

Dictionary<string, object> dic = new Dictionary<string, object>();

/*

这里重写TryGetMemberTrySetMember方法,继承了DynamicObject,

可以override一大堆TryXXX的方法了

*/

public override bool TryGetMember(GetMemberBinder binder, out object result)

{

var name = binder.Name;

Console.WriteLine("获取 {0}",name);

return dic.TryGetValue(name, out result);

}

public override bool TrySetMember(SetMemberBinder binder, object value)

{

var name = binder.Name;

dic[name] = value;

Console.WriteLine("写入 {0} = {1}",name,value);

return true;

}

}

}

我们还可以重写DynamicObject中的其他许多方法,实现我们动态运行时的操作.通过重写里面的方法实现我们动态运行时的自定义操作,这样我们可以更多的趋势线自己的一些动态的组件.

我是个比较啰嗦的人,我觉得有必要去分析一下冲下的那两个方法:TryGetMemberTrySetMember

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/68820.html