zoukankan      html  css  js  c++  java
  • 动态对象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();
            }
        }
  • 相关阅读:
    day67——前后端传输数据的编码格式、ajax传json数据/传文件、批量插入
    day66——choices参数、MTV/MVC模型、三种创建多对多的方式、AJAX
    day65——聚合函数、分组查询、F与Q查询、django开事务、orm查询优化
    dayⅢ、基本数据类型+运算符作业
    dayⅡ:编程语言+变量+垃圾回收制
    dayⅡ:变量作业
    dayⅠ:计算机基础知识
    ⅩⅥ:无参装饰器
    ⅩⅤ:作业
    ⅩⅤ:名称空间与作用域
  • 原文地址:https://www.cnblogs.com/buyinji/p/4756695.html
Copyright © 2011-2022 走看看