C#动态对象(dynamic)详解(实现方法和属性的动态)
C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点javascript的对象味道:
1)定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身。
publicdelegateobjectMyDelegate(dynamicSender,paramsobject[]PMs);
2)定义一个委托转载对象,因为dynamic对象不能直接用匿名方法,这里用对象去承载:
publicclassDelegateObj { privateMyDelegate_delegate; publicMyDelegateCallMethod { get{return_delegate;} } privateDelegateObj(MyDelegateD) { _delegate=D; } ///<summary> ///构造委托对象,让它看起来有点javascript定义的味道. ///</summary> ///<paramname="D"></param> ///<returns></returns> publicstaticDelegateObjFunction(MyDelegateD) { returnnewDelegateObj(D); } }
3)定义一个动态对象:
publicclassDynObj:DynamicObject { //保存对象动态定义的属性值 privateDictionary<string,object>_values; publicDynObj() { _values=newDictionary<string,object>(); } ///<summary> ///获取属性值 ///</summary> ///<paramname="propertyName"></param> ///<returns></returns> publicobjectGetPropertyValue(stringpropertyName) { if(_values.ContainsKey(propertyName)==true) { return_values[propertyName]; } returnnull; } ///<summary> ///设置属性值 ///</summary> ///<paramname="propertyName"></param> ///<paramname="value"></param> publicvoidSetPropertyValue(stringpropertyName,objectvalue) { if(_values.ContainsKey(propertyName)==true) { _values[propertyName]=value; } else { _values.Add(propertyName,value); } } ///<summary> ///实现动态对象属性成员访问的方法,得到返回指定属性的值 ///</summary> ///<paramname="binder"></param> ///<paramname="result"></param> ///<returns></returns> publicoverrideboolTryGetMember(GetMemberBinderbinder,outobjectresult) { result=GetPropertyValue(binder.Name); returnresult==null?false:true; } ///<summary> ///实现动态对象属性值设置的方法。 ///</summary> ///<paramname="binder"></param> ///<paramname="value"></param> ///<returns></returns> publicoverrideboolTrySetMember(SetMemberBinderbinder,objectvalue) { SetPropertyValue(binder.Name,value); returntrue; } ///<summary> ///动态对象动态方法调用时执行的实际代码 ///</summary> ///<paramname="binder"></param> ///<paramname="args"></param> ///<paramname="result"></param> ///<returns></returns> publicoverrideboolTryInvokeMember(InvokeMemberBinderbinder,object[]args,outobjectresult) { vartheDelegateObj=GetPropertyValue(binder.Name)asDelegateObj; if(theDelegateObj==null||theDelegateObj.CallMethod==null) { result=null; returnfalse; } result=theDelegateObj.CallMethod(this,args); returntrue; } publicoverrideboolTryInvoke(InvokeBinderbinder,object[]args,outobjectresult) { returnbase.TryInvoke(binder,args,outresult); } }
应用测试代码:
dynamictheObj=newDynObj(); theObj.aaa="thisisatest";//动态属性 //动态方法,这里不能没法定义参数,调用的时候可以是任意多参数,具体参数类型和含义就只能自己去小心处理了. theObj.show=DelegateObj.Function((s,pms)=> { if(pms!=null&&pms.Length>0) { MessageBox.Show(pms[0].ToString()+":"+s.aaa); } else { MessageBox.Show(s.aaa); } returnnull; } ); theObj.show("hello");
虽然看起来上面有点Js定义对象方法的味道,但由于C#是静态语言,提供的动态模拟机制还是有限的,看起来是动态,但所有的值存放和方法都需要自己写代码去处理.
上面代码在vs2010,windows2008server,框架4.0上测试OK.
以上这篇C#动态对象(dynamic)详解(实现方法和属性的动态)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。