当前位置:编程学习 > C#/ASP.NET >>

C#动态对象(dynamic)示例(实现方法和属性的动态)

C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点javascript的对象味道:

1)定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身.


[csharp]
public delegate object MyDelegate(dynamic Sender, params object[] PMs); 
public delegate object MyDelegate(dynamic Sender, params object[] PMs);

2)定义一个委托转载对象,因为dynamic对象不能直接用匿名方法,这里用对象去承载:

[csharp]
public class DelegateObj 
    { 
        private MyDelegate _delegate; 
 
        public MyDelegate CallMethod 
        { 
            get { return _delegate; } 
        } 
        private DelegateObj(MyDelegate D) 
        { 
            _delegate = D; 
        } 
        /// <summary>  
        /// 构造委托对象,让它看起来有点javascript定义的味道.  
        /// </summary>  
        /// <param name="D"></param>  
        /// <returns></returns>  
        public static DelegateObj Function(MyDelegate D) 
        { 
            return new DelegateObj(D); 
        } 
    } 
public class DelegateObj
    {
        private MyDelegate _delegate;

        public MyDelegate CallMethod
        {
            get { return _delegate; }
        }
        private DelegateObj(MyDelegate D)
        {
            _delegate = D;
        }
        /// <summary>
        /// 构造委托对象,让它看起来有点javascript定义的味道.
        /// </summary>
        /// <param name="D"></param>
        /// <returns></returns>
        public static DelegateObj Function(MyDelegate D)
        {
            return new DelegateObj(D);
        }
    }


3) 定义一个动态对象:

[csharp]
public class DynObj : DynamicObject 
    { 
        //保存对象动态定义的属性值  
        private Dictionary<string, object> _values; 
        public DynObj() 
        { 
            _values = new Dictionary<string, object>(); 
        } 
        /// <summary>  
        /// 获取属性值  
        /// </summary>  
        /// <param name="propertyName"></param>  
        /// <returns></returns>  
        public object GetPropertyValue(string propertyName) 
        { 
            if (_values.ContainsKey(propertyName) == true) 
            { 
                return _values[propertyName]; 
            } 
            return null; 
        } 
        /// <summary>  
        /// 设置属性值  
        /// </summary>  
        /// <param name="propertyName"></param>  
        /// <param name="value"></param>  
        public void SetPropertyValue(string propertyName,object value) 
        { 
            if (_values.ContainsKey(propertyName) == true) 
            { 
                _values[propertyName] = value; 
            } 
            else 
            { 
                _values.Add(propertyName, value); 
            } 
        } 
        /// <summary>  
        /// 实现动态对象属性成员访问的方法,得到返回指定属性的值  
        /// </summary>  
        /// <param name="binder"></param>  
        /// <param name="result"></param>  
        /// <returns></returns>  
        public override bool TryGetMember(GetMemberBinder binder, out object result) 
        { 
            result = GetPropertyValue(binder.Name); 
          &nb

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,