C#Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)
ExpandoObject:表示一个对象,该对象包含可在运行时动态添加和移除的成员。
dynamicdynEO=newExpandoObject();
dynEO.number=10;
dynEO.Increment=newAction(()=>{dynEO.number++;});
Console.WriteLine(dynEO.number);
dynEO.Increment();
Console.WriteLine(dynEO.number);
dynEO.number中number是动态添加属性。
dynEO.Increment中Increment是动态添加的Action委托。
foreach(varpropertyin(IDictionary<String,Object>)dynEO)
{
Console.WriteLine(property.Key+":"+property.Value);
}
结果如下:
Console.ReadLine(); staticvoidProgram_PropertyChanged(objectsender,PropertyChangedEventArgse) 结果: 新建类DynamicProduct,基本和Product类似: 可以看到继承了DynamicObject后,可以override一大堆TryXXX的方法了。 重点需要了解的是:
TryGetMember 在调用intnumber=sampleObject.Number.时使用 TrySetMember 在调用sampleObject.Number=number时使用 TryInvoke 在调用sampleObject(100)时使用 TryInvokeMember 在调用sampleObject.someMethod(100)时使用 完整的代码如下: publicvoidShowProduct() #regionOverrideDynamicObject的方法 publicoverrideIEnumerable<string>GetDynamicMemberNames() publicoverrideboolTryGetMember(GetMemberBinderbinder,outobjectresult) publicoverrideboolTrySetMember(SetMemberBinderbinder,objectvalue) publicoverrideboolTryInvoke(InvokeBinderbinder,object[]args,outobjectresult) publicoverrideboolTryInvokeMember(InvokeMemberBinderbinder,object[]args,outobjectresult) #endregion dynProduct.name="n1";//调用TrySetMember方法 Console.ReadLine(); 结果如下:
理论上来说,应该输出: TrySetMember :设置name字段 TrySetMember :设置Id属性 TryGetMember :获取Id属性 TrySetMember :设置Id属性 TryInvokeMember :调用ShowProduct方法 Id=4,Name=n1 下篇将解释这个问题,请持续关注..
staticvoidMain(string[]args)
{
………
((INotifyPropertyChanged)dynEO).PropertyChanged+=newPropertyChangedEventHandler(Program_PropertyChanged);
dynEO.Name="changed";
dynEO.Name="another";
}
{
Console.WriteLine("属性{0}已更改",e.PropertyName);
}
classDynamicProduct:DynamicObject
{
publicstringname;
publicintId{get;set;}
{
Console.WriteLine("Id={0},Name={1}",Id,name);
}
{
returnbase.GetDynamicMemberNames();
}
{
Console.WriteLine("TryGetMember被调用了,Name:{0}",binder.Name);
returnbase.TryGetMember(binder,outresult);
}
{
Console.WriteLine("TrySetMember被调用了,Name:{0}",binder.Name);
returnbase.TrySetMember(binder,value);
}
{
Console.WriteLine("TryInvoke被调用了");
returnbase.TryInvoke(binder,args,outresult);
}
{
Console.WriteLine("TryInvokeMember被调用了,Name:{0}",binder.Name);
returnbase.TryInvokeMember(binder,args,outresult);
}
}
Main函数代码如下:
staticvoidMain(string[]args)
{
dynamicdynProduct=newDynamicProduct();
dynProduct.Id=1;
dynProduct.Id=dynProduct.Id+3;
dynProduct.ShowProduct();
}
相关文章