zoukankan      html  css  js  c++  java
  • c# dynamic实现动态实体,不用定义实体就能序列化为标准json

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Dynamic;
    
    namespace SelfDynamicObj
    {
        public delegate object DeleDynamic(dynamic sender, params object[] pramas);
        public class DynObj : DynamicObject
        {
            public Dictionary<string, object> _values;
    
            public DynObj()
            {
                _values = new Dictionary<string, object>();
            }
    
            public object GetPropertyValue(string propertyName)
            {
                if (_values.ContainsKey(propertyName) == true)
                {
                    return _values[propertyName];
                }
                return null;
            }
    
            public void SetPropertyValue(string propertyName, object value)
            {
                if (_values.ContainsKey(propertyName) == true)
                {
                    _values[propertyName] = value;
                }
                else
                {
                    _values.Add(propertyName, value);
                }
    
            }
    
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                result = GetPropertyValue(binder.Name);
                return result == null ? false : true;
            }
    
            public override bool TrySetMember(SetMemberBinder binder, object value)
            {
                SetPropertyValue(binder.Name, value);
                return true;
            }
    
            public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
            {
                var deleObj = GetPropertyValue(binder.Name) as DelegateObj;
                if (deleObj == null || deleObj.CallMethod == null)
                {
                    result = null;
                    return false;
                }
                result = deleObj.CallMethod(this, args);
                return true;
            }
    
            public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
            {
                return base.TryInvoke(binder, args, out result);
            }
    
        }
    
    
        public class DelegateObj
        {
            private DeleDynamic _deleDynamic;
    
            public DeleDynamic CallMethod
            {
                get { return _deleDynamic; }
            }
    
            public DelegateObj(DeleDynamic deleDynamic)
            {
                this._deleDynamic = deleDynamic;
            }
    
            public static DelegateObj Function(DeleDynamic deleDynamic)
            {
                return new DelegateObj(deleDynamic);
            }
        }
    }

    使用如下:

    List<string> names = new List<string>() { "a00", "b00", "c00", "d00" };

    
    


    dynamic obj = new DynObj();
    obj.date = "2019-02-26";
    obj.stories = names;
    string result0 = JsonConvert.SerializeObject(obj._values);

    序列化后的结果如下:

    {
    "date": "2019-02-26",
    "stories": ["a00", "b00", "c00", "d00"]
    }

    
    
  • 相关阅读:
    Jenkins学习记录(三)
    Jenkins学习记录(二)
    并发编程
    黏包及解决方法
    socket通信,三次握手,四次挥手
    异常处理
    元类与魔法方法
    封装方法与多态
    组合与封装
    继承
  • 原文地址:https://www.cnblogs.com/mibing/p/11377013.html
Copyright © 2011-2022 走看看