玩转动态编译(二) 实战2014-03-20 cnblogs 冰麟轻武在玩转动态编译:一、初识中,我们已经学会了最简单的使用动态编译。今天直接由实战入手,看看 真实情况下的动态编译能为我们来带什么。今天要演示的实例是一个在实际开发中经常遇到的情 况,对象转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) + "}";}}}