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小时内删除。