C#动态对象(dynamic)⽰例(实现⽅法和属性的动态)param name
C#的动态对象的属性实现⽐较简单,如果要实现动态语⾔那种动态⽅法就⽐较困难,因为对于dynamic对象,扩展⽅法,匿名⽅法都是不能⽤直接的,这⾥还是利⽤对象和委托来模拟这种动态⽅法的实现,看起来有点的对象味道:
1)定义⼀个委托,参数个数可变,参数都是object类型:这⾥的委托多有个dynamic参数,代表调⽤这个委托的动态对象本⾝.
1public delegate object MyDelegate(dynamic Sender, params object[] PMs);
2)定义⼀个委托转载对象,因为dynamic对象不能直接⽤匿名⽅法,这⾥⽤对象去承载:
1public class DelegateObj
2 {
3private MyDelegate _delegate;
4
5public MyDelegate CallMethod
6 {
7get { return _delegate; }
8 }
9private DelegateObj(MyDelegate D)
10 {
11 _delegate = D;
12 }
13///<summary>
14///构造委托对象,让它看起来有点javascript定义的味道.
15///</summary>
16///<param name="D"></param>
17///<returns></returns>
18public static DelegateObj Function(MyDelegate D)
19 {
20return new DelegateObj(D);
21 }
22 }
3) 定义⼀个动态对象:
1public class DynObj : DynamicObject
2 {
3//保存对象动态定义的属性值
4private Dictionary<string, object> _values;
5public DynObj()
6 {
7 _values = new Dictionary<string, object>();
8 }
9///<summary>
10///获取属性值
11///</summary>
12///<param name="propertyName"></param>
13///<returns></returns>
14public object GetPropertyValue(string propertyName)
15 {
16if (_values.ContainsKey(propertyName) == true)
17 {
18return _values[propertyName];
19 }
20return null;
21 }
22///<summary>
23///设置属性值
24///</summary>
25///<param name="propertyName"></param>
26///<param name="value"></param>
27public void SetPropertyValue(string propertyName,object value)
28 {
29if (_values.ContainsKey(propertyName) == true)
30 {
31 _values[propertyName] = value;
32 }
33else
34 {
35 _values.Add(propertyName, value);
36 }
37 }
38///<summary>
39///实现动态对象属性成员访问的⽅法,得到返回指定属性的值
40///</summary>
41///<param name="binder"></param>
42///<param name="result"></param>
43///<returns></returns>
44public override bool TryGetMember(GetMemberBinder binder, out object result)
45 {
46 result = GetPropertyValue(binder.Name);
47return result == null ? false : true;
48 }
49///<summary>
50///实现动态对象属性值设置的⽅法。
51///</summary>
52///<param name="binder"></param>
53///<param name="value"></param>
54///<returns></returns>
55public override bool TrySetMember(SetMemberBinder binder, object value)
56 {
57 SetPropertyValue(binder.Name, value);
58return true;
59 }
60///<summary>
61///动态对象动态⽅法调⽤时执⾏的实际代码
62///</summary>
63///<param name="binder"></param>
64///<param name="args"></param>
65///<param name="result"></param>
66///<returns></returns>
67public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
68 {
69var theDelegateObj = GetPropertyValue(binder.Name) as DelegateObj;
70if (theDelegateObj == null || theDelegateObj.CallMethod == null)
71 {
72 result = null;
73return false;
74 }
75 result = theDelegateObj.CallMethod(this,args);
76return true;
77 }
78public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
79 {
80return base.TryInvoke(binder, args, out result);
81 }
82 }
测试代码:
1dynamic theObj = new DynObj();
2 theObj.aaa = "this is a test";//动态属性
3//动态⽅法,这⾥不能没法定义参数,调⽤的时候可以是任意多参数,具体参数类型和含义就只能⾃⼰去⼩⼼处理了.
4 theObj.show = DelegateObj.Function((s, pms) =>
5 {
6if (pms != null && pms.Length > 0)
7 {
8 MessageBox.Show(pms[0].ToString() + ":" + s.aaa);
9 }
10else
11 {
12 MessageBox.Show(s.aaa);
13 }
14return null;
15 }
16 );
17 theObj.show("hello");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论