C#动态编译

 

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

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

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

 

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

public class ViewBag:System.Dynamic.DynamicObject
{
       private Dictionary<string, object> storage = new Dictionary<string, object>();
 
       public override bool TryGetMember(GetMemberBinder binder, out object result)
       {
           if (storage.ContainsKey(binder.Name))
           {
               result = storage[binder.Name];
               return true;
           }
 
           result = null;
           return false;
       }
 
 
       public override bool TrySetMember(SetMemberBinder binder, object value)
       {
           string key = binder.Name;
 
           if (storage.ContainsKey(key))
               storage[key] = value;
           else
               storage.Add(key, value);
 
           return true;
       }
 
       public override string ToString()
       {
           StringBuilder strSb = new StringBuilder();
           foreach (var item in storage)
           {
               strSb.AppendFormat("property {0}:{1} ",item.Key,item.Value);
           }
           return strSb.ToString();
       }
}
 
 

二 使用如下

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

 

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

你可能感兴趣的:(C#动态编译)