zoukankan      html  css  js  c++  java
  • C#匿名对象(转JSON)互转、动态添加属性

    多类型匿名对象

    var result = new
                    {
                       pages = 10,
                       users = new System.Collections.ArrayList
                        {
                            new{id=1,name="2"},
                            new{id=2,name="3"}
                        }
                    };
                    result.users.Add(new { id = 3, name = "4" });
    
    new {
        a = Tuple
            .Create(
                 new List<Attribute>()
                 {
                      new MaskAttribute(".00") 
                 },1),
        b = Tuple
            .Create(
                 new List<Attribute>()
                 {
                      new MaskAttribute("#.0") 
                 },2)
     
         }
    
    
    public static Tuple<List<attributes>,T> CreateMetaField <T>(this T value , params Attribute[] args)
    new {
        a=1.CreateMetaField(new attr...() ) ,
        b=2.CreateMetaField(new attr...() )
    }

    完全动态方式2:

    public class DynamicClassHelper
        {
            /// <summary>
            /// 创建属性
            /// </summary>
            /// <param name="propertyname"></param>
            /// <returns></returns>
            private static string Propertystring(string propertyname)
            {
                StringBuilder sbproperty = new StringBuilder();
                sbproperty.Append(" private   string   _" + propertyname + "   =  null;
    ");
                sbproperty.Append(" public   string  " + "" + propertyname + "
    ");
                sbproperty.Append(" {
    ");
                sbproperty.Append(" get{   return   _" + propertyname + ";}   
    ");
                sbproperty.Append(" set{   _" + propertyname + "   =   value;   }
    ");
                sbproperty.Append(" }");
                return sbproperty.ToString();
            }
            /// <summary>
            /// 创建动态类
            /// </summary>
            /// <param name="listMnProject">属性列表</param>
            /// <returns></returns>
            public static Assembly Newassembly(List<string> propertyList)
            {
                //创建编译器实例。   
                CSharpCodeProvider provider = new CSharpCodeProvider();
                //设置编译参数。   
                CompilerParameters paras = new CompilerParameters();
                paras.GenerateExecutable = false;
                paras.GenerateInMemory = true;
    
                //创建动态代码。   
                StringBuilder classsource = new StringBuilder();
                classsource.Append("public   class   dynamicclass 
    ");
                classsource.Append("{
    ");
    
                //创建属性。   
                for (int i = 0; i < propertyList.Count; i++)
                {
                    classsource.Append(Propertystring(propertyList[i]));
                }
                classsource.Append("}");
                System.Diagnostics.Debug.WriteLine(classsource.ToString());
                //编译代码。   
                CompilerResults result = provider.CompileAssemblyFromSource(paras, classsource.ToString());
                //获取编译后的程序集。   
                Assembly assembly = result.CompiledAssembly;
    
                return assembly;
            }
            /// <summary>
            /// 给属性赋值
            /// </summary>
            /// <param name="objclass"></param>
            /// <param name="propertyname"></param>
            /// <param name="value"></param>
            public static void Reflectionsetproperty(object objclass, string propertyname, string value)
            {
                PropertyInfo[] infos = objclass.GetType().GetProperties();
                foreach (PropertyInfo info in infos)
                {
                    if (info.Name == propertyname && info.CanWrite)
                    {
                        info.SetValue(objclass, value, null);
                    }
                }
            }
            /// <summary>
            /// 得到属性值
            /// </summary>
            /// <param name="objclass"></param>
            /// <param name="propertyname"></param>
            public static void Reflectiongetproperty(object objclass, string propertyname)
            {
                PropertyInfo[] infos = objclass.GetType().GetProperties();
                foreach (PropertyInfo info in infos)
                {
                    if (info.Name == propertyname && info.CanRead)
                    {
                        System.Console.WriteLine(info.GetValue(objclass, null));
                    }
                }
            }
        }

    使用方法

      //将配置的参数名加入propertyList列表
                List<string> propertyList = ParamsList.Select(t => t.CodeID).ToList();
                //获取数据导入记录明细的属性名
                T_DataDetailExtInfo modelDataDetail = new T_DataDetailExtInfo();
                Type typeDataDetail = modelDataDetail.GetType(); //获得该类的Type
                //将数据表属性名加入propertyList列表
                propertyList.AddRange(typeDataDetail.GetProperties().Select(p => p.Name));
                //创建动态类,监测参数ID为它的属性
                Assembly assembly = DynamicClassHelper.Newassembly(propertyList);
                var listclass = new List<dynamic>();
                if (listDataDetail != null && listDataDetail.Count > 0)
                {
                    //明细数据
                    foreach (var data in listDataDetail)
                    {
                        dynamic model = assembly.CreateInstance("dynamicclass");
                        //赋值
                        DynamicClassHelper.Reflectionsetproperty(model, "ID", data.DetailID);
                    }
    
                    listclass.Add(model);
                }

    匿名对象转Json——有匿名对象(IEnumerable、Linq)有时候不必要每次去创建新的Model类或动态创建Model类

     List<dynamic> listData = new List<dynamic>();
    foreach (var temp in listLog)
                            {
                                var logModel = new
                                {
                                    DataDate = temp.DataTime,
                                    Content = temp.LogContent
                                };
                                listData.Add(logModel);
                            }
    
    string strJson = JsonHelper.GetUnknownJson(listData);
    
    
            /// <summary>
            ///  对未知或匿名对象进行Json序列化 ——JsonHelper类
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string GetUnknownJson(object value)
            {
                if (value == null) return null;
                var jss = new JavaScriptSerializer();
                jss.MaxJsonLength = int.MaxValue;
                return jss.Serialize(value);
            }

    JSON转匿名对象--引用Newtonsoft.Json.dll

    //Json转匿名对象{“code”:“0”,“message”:“success”}
    var rspObj = JsonConvert.DeserializeAnonymousType(text, new { code = "", message = "" });
    
    //Json转List的匿名对象 {{“Code”:“V1”,“Text”:“字典1”},{“Code”:“L2”,“Text”:“字典2”},{“Code”:“L3”,“Text”:“字典3”}]
    var rspObj = JsonConvert.DeserializeAnonymousType(rsp,new[] { new { Code = "", Text = "" } }.ToList());

     JObject 使用 -- Newtonsoft.Json

    //创建匿名对象
    JObject obj = new JObject();
    obj.Add("ID", 1);
    obj.Add("Name", "张三");
    obj.Add("Birthday", DateTime.Parse("2000-01-02"));
    obj.Add("IsVIP", true);
    obj.Add("Account", 12.34f);
    // 创建数组
    JArray array = new JArray();
    array.Add(new JValue("吃饭"));
    array.Add(new JValue("睡觉"));
    obj.Add("Favorites", array);
    obj.Add("Remark", null);
    
    // 创建数组2
    JArray array = new JArray("吃饭", "睡觉");
    
    //从 Json 字符串创建 JObject
    string json = "{"ID":1,"Name":"张三","Birthday":"2000-01-02T00:00:00","IsVIP":true,"Account":12.34,"Favorites":["吃饭","睡觉"],"Remark":null}";
    JObject obj = JObject.Parse(json);
    
    //用匿名对象创建 JObject
    JObject obj = JObject.FromObject(new { name = "jack", age = 18 });
    //显示
    {
      "name": "jack",
      "age": 18
    }
    
    //用初始化器
    JObject obj = new JObject()
    {
        { "name", "jack" },
        { "age", 18 }
    };
    
    //获取值
    int id;
    if (obj["ID"] != null)
        id = obj["ID"].Value<int>();
        
    //获取数组
    string[] favorites;
    if (obj["Favorites"] != null)
        favorites = obj["Favorites"].Value<List<string>>().ToArray();
                //基于创建的list使用LINQ to JSON创建期望格式的JSON数据
                lbMsg.InnerText = new JObject(
                        new JProperty("total", studentList.Count),
                        new JProperty("rows",
                                new JArray(
                                        //使用LINQ to JSON可直接在select语句中生成JSON数据对象,无须其它转换过程
                                        from p in studentList
                                        select new JObject(
                                                new JProperty("studentID", p.StudentID),
                                                new JProperty("name", p.Name),
                                                new JProperty("homeTown", p.Hometown)
                                            )
                                    )
                            )
                    ).ToString();
    //用ExpandoObject 动态添加属性 存储和获取值
            static void Main()
            {
                dynamic expando = new ExpandoObject();
                //{System.Dynamic.ExpandoObject}
                IDictionary<string, object> dictionary = expando;
                //{System.Dynamic.ExpandoObject}
                expando.First = "value set dynamically";
                Console.WriteLine(dictionary["First"]);
     
                dictionary["Second"] = "value set with dictionary";
                Console.WriteLine(expando.Second);
        }
  • 相关阅读:
    HTTP与HTTPS
    各种排序算法的比较
    数据结构之堆排序
    数据结构之希尔排序
    快速排序与归并排序的区别与联系
    数据结构之快速排序
    DVWA-4.3 File Inclusion(文件包含)-High-利用file协议绕过防护策略
    DVWA-4.2 File Inclusion(文件包含)-Medium-双写绕过str_replace替换规则
    DVWA-4.1 File Inclusion(文件包含)-Low
    DVWA-3.4 CSRF(跨站请求伪造)-Impossible
  • 原文地址:https://www.cnblogs.com/elves/p/6087186.html
Copyright © 2011-2022 走看看