在玩转动态编译:一、初识中,我们已经学会了最简单的使用动态编译。今天直接由实战入手,看看 真实情况下的动态编译能为我们来带什么。
今天要演示的实例是一个在实际开发中经常遇到的情 况,对象转Json。
我将会使用2种方式分别做一个转json字符串的实例,1:反射;2:动态编译
分析问题
分析C#对象在json中的映射。总体来说json对象只有几种情况
键值对 对象,由多组键对象+值对象构成,最外面是一对花括号包裹,键值对对象同时也可作为“值对象”使用
数组对象,由多个值对象构成,最外面是一对中括号包裹,数组对象同时也可作为“值对象”使 用
键对象,由一个字符串构成,在键值对对象组成中担任“键”
一般值对象,由一个单 独的值构成,可以是string,int,bool等,在键值对对象或者数组对象中担任“值”
特殊值对 象,键值对对象或数组对象,本身也可以作为值对象使用
这4中对象分别对应了C#中的:
键值对对象 -> 任何有公开属性的对象,或者实现了IDictionary的对象,或者同时拥有Key和Value枚 举的对象
数组对象 -> 实现了IEnumerator或者IEnumerable接口的对象
键对象 -> string对象
一般值对象 -> System命名空间下的简单值类型,包括int,bool,float,DateTime 等,外加一个string
编写基类
为了满足所有类型的转换需求,首先要建立一个抽象基类 JsonConverter
using System; using System.Collections; using System.Collections.Generic; namespace blqw { /// <summary> /// 用于将C#转换为Json字符串的抽象基类,基类提供基本类型的转换,也可以重写 /// </summary> public abstract class JsonConverter { public abstract string ToJson(object obj); public const string Flag = """; //基本类型转换Json字符串 //bool值转为true,false, //数值类型直接输出,日期类型转为指定格式字符串,前后加上双引号 //字符串内部()替换为(),(")替换("),前后加上双引号 //Guid转为没有-的字符串,前后加上双引号 //方法命名按照From + 参数类名,为了一会反射和动态编译的时候查找方法更方便 public virtual string FromBoolean(Boolean val) { return val ? "true" : "false"; } public virtual string FromByte(Byte val) { return val.ToString(); } public virtual string FromChar(Char val) { return val.ToString(); } public virtual string FromDateTime(DateTime val) { return Flag + val.ToString("yyyy-MM-dd HH:mm:ss") + Flag; } public virtual string FromDecimal(Decimal val) { return val.ToString(); } public virtual string FromDouble(Double val) { return val.ToString(); } public virtual string FromInt16(Int16 val) { return val.ToString(); } public virtual string FromInt32(Int32 val) { return val.ToString(); } public virtual string FromInt64(Int64 val) { return val.ToString(); } public virtual string FromSByte(SByte val) { return val.ToString(); } public virtual string FromSingle(Single val) { return val.ToString(); } public virtual string FromString(String val) { return Flag + val.Replace(@"",@"").Replace(""",@"""")+ Flag; } public virtual string FromUInt16(UInt16 val) { return val.ToString(); } public virtual string FromUInt32(UInt32 val) { return val.ToString(); } public virtual string FromUInt64(UInt64 val) { return val.ToString(); } public virtual string FromGuid(Guid val) { return Flag + val.ToString("N") + Flag; } //枚举 public virtual string FromEnum(Enum val) { return Flag + val.ToString() + Flag; } //转换数组对象 public virtual string FromArray(IEnumerator ee) { List<string> list = new List<string>(); while (ee.MoveNext()) { list.Add(ToJson(ee.Current)); } return "[" + string.Join(",", list) + "]"; } //转换键值对对象 public virtual string FromKeyValue(IEnumerable keys, IEnumerable values) { List<string> list = new List<string>(); var ke = keys.GetEnumerator(); var ve = values.GetEnumerator(); bool a, b; while ((a = ke.MoveNext()) & (b = ve.MoveNext())) { if (ke.Current == null || (ke.Current + "").Length == 0) { throw new ArgumentNullException("Json键不能为null或空"); } list.Add(Flag + ke.Current + Flag + ":" + ToJson(ve.Current)); } if (a != b) { throw new ArgumentException("键值对的键和值个数不一致"); } return "{" + string.Join(",", list) + "}"; } } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 对象
, return
, 键值对
, public
, virtual
, val
, json数组传入list
, String对象
, val()
, val方法
, String值
, JSON传递bool
string转json对象
玩转微信营销实战手册、android反编译实战、充气娃实战过程动态图、水野朝阳实战动态图、水岛津实实战动态图,以便于您获取更多的相关知识。