C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)
expandoobject:表示一个对象,该对象包含可在运行时动态添加和移除的成员。
dynamic dyneo = new expandoobject();
dyneo.number = 10;
dyneo.increment = new action(() => { dyneo.number++; });
console.writeline(dyneo.number);
dyneo.increment();
console.writeline(dyneo.number);
dyneo.number 中number是动态添加属性。
dyneo.increment 中increment 是动态添加的action 委托。
枚举expandoobject的所有成员:
foreach (var property in (idictionary<string, object>)dyneo)
{
console.writeline(property.key + ": " + property.value);
}
结果如下:
接收属性更改的通知:
static void main(string[] args)
{
………
((inotifypropertychanged)dyneo).propertychanged += new propertychangedeventhandler(program_propertychanged);
dyneo.name = "changed";
dyneo.name = "another";
console.readline();
}
static void program_propertychanged(object sender, propertychangedeventargs e)
{
console.writeline("属性{0} 已更改", e.propertyname);
}
结果:
system.dynamic.dynamicobject:提供用于指定运行时的动态行为的基类
新建类dynamicproduct,基本和product类似:
可以看到继承了dynamicobject后,可以override 一大堆tryxxx的方法了。
重点需要了解的是:
假设sampleobject 就是dynamicobject | |
trygetmember |
在调用 int number = sampleobject.number.时使用 |
trysetmember |
在调用sampleobject.number = number 时使用 |
tryinvoke |
在调用sampleobject(100) 时使用 |
tryinvokemember |
在调用sampleobject.somemethod(100) 时使用 |
完整的代码如下:
class dynamicproduct : dynamicobject
{
public string name;
public int id { get; set; }
public void showproduct()
{
console.writeline("id={0} ,name={1}", id, name);
}
#region override dynamicobject 的方法
public override ienumerable<string> getdynamicmembernames()
{
return base.getdynamicmembernames();
}
public override bool trygetmember(getmemberbinder binder, out object result)
{
console.writeline("trygetmember被调用了,name:{0}", binder.name);
return base.trygetmember(binder, out result);
}
public override bool trysetmember(setmemberbinder binder, object value)
{
console.writeline("trysetmember被调用了,name:{0}", binder.name);
return base.trysetmember(binder, value);
}
public override bool tryinvoke(invokebinder binder, object[] args, out object result)
{
console.writeline("tryinvoke被调用了");
return base.tryinvoke(binder, args, out result);
}
public override bool tryinvokemember(invokememberbinder binder, object[] args, out object result)
{
console.writeline("tryinvokemember被调用了,name:{0}", binder.name);
return base.tryinvokemember(binder, args, out result);
}
#endregion
}
main函数代码如下:
static void main(string[] args)
{
dynamic dynproduct = new dynamicproduct();
dynproduct.name = "n1"; //调用trysetmember方法
dynproduct.id = 1;
dynproduct.id = dynproduct.id + 3;
dynproduct.showproduct();
console.readline();
}
结果如下:
理论上来说,应该输出:
trysetmember :设置name字段
trysetmember :设置id属性
trygetmember :获取id属性
trysetmember :设置id属性
tryinvokemember :调用showproduct方法
id =4 ,name = n1
为什么tryxxx方法没有被调用??
下篇将解释这个问题,请持续关注..