在Dynamic关键字中有童鞋提到DynamicObject了,所以就翻翻书,股沟学习下,然后做个笔记,方便以后学习使用,跟大家分享下这些基本的东西吧。。
1.ExpandoObject 表示一个对象,该对象包含可在运行时动态添加和移除的成员。,这个类是在System.Dynamic这个命名空间下,那么肯定跟动态类型有关,这个类能做什么呢?我们看一下下面的例子:
class Program
{
static void Main()
{
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那么麻烦,只要用这个类就可以了,不过,需要注意的是,这个类是在运行时解析的,这样我们就会带来性能上的一些损失,而且,在编写较复杂的逻辑时,不容易发现问题所在,所以,对于简单的对象,我们可以使用这个类,复杂的就不要用了。
2.DynamicObject, DynamicObject跟ExpandoObject最大的区别就是,我们可以通过继承DynamicObject,自己来决定动态对象如何执行。我们先来看下DynamicObject的定义中初始化函数:
public class DynamicObject : IDynamicMetaObjectProvider
{
protected DynamicObject();
}
可以看到的是我们不可以对DynamicObject直接实例化的,这也是DynamicObject设计的初衷,由我们自己来定义运行时的动态的成员的处理。一般的时候如果我们自定义的类型只需要处理一些动态的属性的时候我们只需要重写TryGetMember跟TrySetMember方法。
class test:DynamicObject
{
Dictionary<string, object> dic = new Dictionary<string, object>();
/*这里重写了TryGetMember和TrySetMember方法,继承了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;
}
}
class Program
{
static void Main()
{
dynamic employee = new test();
employee.Name = "xiaobai";
employee.Age = "21";
employee.Sex = "N";
Console.WriteLine("Name:{0},Age:{1},Sex:{2}", employee.Name, employee.Age, employee.Sex);
Console.ReadKey();
}
}
我们还可以重写DynamicObject中的其他许多方法,实现我们动态运行时的操作。这里就不再举例了。通过重写里面的方法实现我们动态运行时的自定义操作,这样我们可以更多的去实现自己一些动态的组件。