C#动态编译

 

C#提供了DynamicObject和IDynamicMetaObjectProvider两种方式实现动态类型,动态类型的好处是类型的公有接口可以在运行时改变。

创建动态类型最简单的方法就是继承DynamicObject,需要实现的方法有TryGetMember和TrySetMember。

如果你必须使用其他基类,那么还可以手工实现IDynamicMetaObjectProvider。

一.具体例子:实现一个可以动态添加属性包的类

 1 public class ViewBag:System.Dynamic.DynamicObject
 2 {
 3        private Dictionary<string, object> storage = new Dictionary<string, object>();
 4 
 5        public override bool TryGetMember(GetMemberBinder binder, out object result)
 6        {
 7            if (storage.ContainsKey(binder.Name))
 8            {
 9                result = storage[binder.Name];
10                return true;
11            }
12  
13            result = null;
14            return false;
15        }
16 
17        public override bool TrySetMember(SetMemberBinder binder, object value)
18        {
19            string key = binder.Name;
20 
21            if (storage.ContainsKey(key))
22           {
23                  storage[key] = value;
24            }
25            else
26            {
27                storage.Add(key, value);
28             }
29 
30            return true;
31        }
32 
33        public override string ToString()
34        {
35            StringBuilder strSb = new StringBuilder();
36 
37            foreach (var item in storage)
38            {
39                strSb.AppendFormat("property {0}:{1} ",item.Key,item.Value);
40            }
41 
42            return strSb.ToString();
43        }
44 
45 }

二 使用如下

1. 为自定义属性赋值
dynamic bag = new ViewBag();
bag.Property1 ="test";

2.取值

string propertyValue= bag.Property1;

 

作者:B.it

技术收录网站:核心技术(http://www.coretn.cn)
出处:http://www.cnblogs.com/ImBit/p/5085247.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

核心技术(http://www.localyc.com)
原文地址:https://www.cnblogs.com/ImBit/p/5085247.html