dynamicObject

public class WroxDynamicObject : DynamicObject
    {
        private Dictionary<string, object> _dynamicData = new Dictionary<string, object>();

        /// <summary>
        /// 获取成员值的操作提供实现
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            bool success = false;
            result = null;
            if (_dynamicData.ContainsKey(binder.Name))
            {
                result = _dynamicData[binder.Name];
                success = true;
            }
            else
            {
                result = "Property Not Found!";
                success = false;
            }
            return success;
        }

        /// <summary>
        /// 设置成员值的操作提供实现
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            _dynamicData[binder.Name] = value;
            return true;
        }

        /// <summary>
        /// 调用成员的操作提供实现
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="args"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            dynamic method = _dynamicData[binder.Name];
            result = method((DateTime)args[0]);
            return result != null;
        }

        private Dictionary<int, object> _dynamicIndex = new Dictionary<int, object>();

        /// <summary>
        /// 为按索引获取值的操作提供实现
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="indexes"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            int index = (int)indexes[0];
            bool success = false;
            if (_dynamicIndex.ContainsKey(index))
            {
                result = _dynamicIndex[index];
                success = true;
            }
            else
            {
                result = "Not Found Index";
            }
            return success;
        }

        /// <summary>
        /// 为按索引设置值的操作提供实现
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="indexes"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
        {
            _dynamicIndex[(int)indexes[0]] = value;
            return true;
        }
    }
public static void Main()
        {
            dynamic wroxDyn = new WroxDynamicObject();
            wroxDyn.FirstName = "Bugs";
            wroxDyn.LastName = "Bunny";
            Console.WriteLine(wroxDyn.GetType());
            Console.WriteLine("{0} {1}", wroxDyn.FirstName, wroxDyn.LastName);

            Func<DateTime, string> GetTomorrow = today => today.AddDays(1).ToShortDateString();
            wroxDyn.GetTomorrowDate = GetTomorrow;
            Console.WriteLine("Tomorrow is {0}", wroxDyn.GetTomorrowDate(DateTime.Now));

            wroxDyn[0] = 1;
            Console.WriteLine(wroxDyn[0]);
            Console.Read();
        }

 

posted @ 2015-05-05 14:26  江境纣州  阅读(91)  评论(0)    收藏  举报