动态对象DynamicObject实现让字典书写更优美

我想用过MVC的人都知道一件事,viewbag的值是存储在viewdata里面的。

 

先看以下组图:

看了上图是不是感觉很神奇,Dictionary<string, object>也可以这样使用~

实现主要继承了DynamicObject

接下来直接贴代码:

/// <summary>
    /// 动态对象
    /// </summary>
    public class VarObject : DynamicObject
    {
        /// <summary>
        /// 数据字段
        /// </summary>
        private Dictionary<string, object> ViewData = new Dictionary<string, object>();

        /// <summary>
        /// 调用 varo(); 时执行
        /// dynamic varo = new VarObject();
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="args"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
        {
            return base.TryInvoke(binder, args, out result);
        }

        /// <summary>
        /// 调用 varo.Method(); 时执行
        /// dynamic varo = new VarObject();
        /// </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)
        {
            return base.TryInvokeMember(binder, args, out result);
        }

        /// <summary>
        /// 调用 varo + varo; 时执行
        /// dynamic varo = new VarObject();
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="arg"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result)
        {
            return base.TryBinaryOperation(binder, arg, out result);
        }

        /// <summary>
        /// 调用 varo++; 时执行
        /// dynamic varo = new VarObject();
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryUnaryOperation(UnaryOperationBinder binder, out object result)
        {
            return base.TryUnaryOperation(binder, out result);
        }

        /// <summary>
        /// 调用 varo["key"]; 时执行
        /// dynamic varo = new VarObject();
        /// </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)
        {
            if (indexes == null || indexes.Length != 1)
            {
                throw new ArgumentException("indexes");
            }

            result = null;
            string key = indexes[0] as string;
            if (key != null)
            {
                result = ViewData[key];
            }
            else
            {
                throw new ArgumentException("indexes");
            }
            return true;
        }

        /// <summary>
        /// 调用 varo["key"] = "value"; 时执行
        /// dynamic varo = new VarObject();
        /// </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)
        {
            if (indexes == null || indexes.Length != 1)
            {
                throw new ArgumentException("indexes");
            }

            string key = indexes[0] as string;
            if (key != null)
            {
                ViewData[key] = value;
                return true;
            }
            else
            {
                throw new ArgumentException("indexes");
            }
        }

        /// <summary>
        /// 获取所有key
        /// </summary>
        /// <returns></returns>
        public override IEnumerable<string> GetDynamicMemberNames()
        {
            return ViewData.Keys;
        }

        /// <summary>
        /// 调用 varo.key; 时执行
        /// dynamic varo = new VarObject();
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = ViewData[binder.Name];
            return true;
        }

        /// <summary>
        /// 调用 varo.key = "value"; 时执行
        /// dynamic varo = new VarObject();
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            ViewData[binder.Name] = value;
            return true;
        }
    }

运行代码:

    class Program
    {

        static void Main(string[] args)
        {
            dynamic varo = new VarObject();

            varo.a = "value";
           
            varo.b = "2";

            varo["c"] = 3;

            var d = varo++;

            var e = varo + varo;

            varo(); 

            varo.Method(); 

            foreach(var v in varo.GetDynamicMemberNames())
            {
                Console.WriteLine(v); 
            }
           
            Console.WriteLine("done."); 
            Console.ReadKey();
        }
    }

 

转载于:https://www.cnblogs.com/soneltd/p/4756695.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值