expandoobject:表示一个对象,该对象包含可在运行时动态添加和移除的成员。
console.writeline(dyneo.number);
dyneo.increment();
console.writeline(dyneo.number);
dyneo.increment 中increment 是动态添加的action 委托。
枚举expandoobject的所有成员:
结果如下:
接收属性更改的通知:
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) 时使用 |
完整的代码如下:
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
}
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方法没有被调用??
下篇将解释这个问题,请持续关注..
如对本文有疑问, 点击进行留言回复!!
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析
网友评论