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)