• 动态对象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();
            }
        }
  • 相关阅读:
    大数据集群迁移的那一夜是怎么过的
    什么是Lambda架构
    从0到1搭建自助分析平台
    业务重要?还是技术重要?
    如何从0到1搭建大数据平台
    从0到1搭建大数据平台之数据采集系统
    高频面试题:秒杀场景设计
    面试官:面对千万级、亿级流量怎么处理?
    来自朋友最近阿里、腾讯、美团等P7岗位面试题
    《我想进大厂》之JVM夺命连环10问
  • 原文地址:https://www.cnblogs.com/buyinji/p/4756695.html
Copyright © 2020-2023  润新知