玩转动态编译(二) 实战

在玩转动态编译:一、初识中,我们已经学会了最简单的使用动态编译。今天直接由实战入手,看看 真实情况下的动态编译能为我们来带什么。

今天要演示的实例是一个在实际开发中经常遇到的情 况,对象转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反编译实战、充气娃实战过程动态图、水野朝阳实战动态图、水岛津实实战动态图,以便于您获取更多的相关知识。

时间: 2024-10-28 18:30:57

玩转动态编译(二) 实战的相关文章

玩转动态编译(三) 提高性能,抛弃反射

通过之前2篇文章的介绍,大家一定发现了,动态编译后的对象只能通过反射调用,但是反射往往是 一个程序性能的瓶颈,这个真的无法突破么?答案当然是否定的,接下来就我就来说说怎么才能,挖掘 动态编译的潜力. 一点废话 我刚来博客园才1星期左右,昨天才弄懂怎么发表到首页,先 说声抱歉了,昨天的文章有几个地方贴的源码居然少了几个字符,有点莫名其妙,也难怪有人不能运行 了,虽然是小错误,但是如果认真检查的话也是可以避免的,这是我的失误. 还有一点,这个< 玩转动态编译>是一个系列的,虽然没有大纲,不知道会写

玩转动态编译(四) 封装

既然要使用动态编译,那么为他封装一个调用类,在调用时省去大量不必要的编码操作还是很有必要的 . 为什么要封装? 其实这个说起来很简单,就是发现现有的动态编译类在使用过程中显 得并不是那么好用.我觉得我可以让他变的更易使用. 所以我应该重新封装了一个 DynamicCompile类. 不过在这之前我还要考虑一下一个问题: 我需要什么? 在使 用动态编译的过程中,我逐渐的发现,动态编译有以下几种情况 1.我拼接了一个静态类的代码, 需要返回这个类的类型 2.我拼接了一个拥有无参构造函数的类的代码,需

玩转动态编译(一) 初识

动态编译的好处其实有很多,但是我发现很多人其实没有真正理解或者没有灵活运用动态编译,使得这 么强大的一个功能变成了鸡肋.在我自己使用的工具库中有很多地方都使用了动态编译,以后我会慢慢 把工具库中的代码都发布出来,所以先把动态编译的相关知识点整理了一下 什么是动态编译? 我的个人理解就是,在程序运行期间,将C#代码的字符串编译成为程序集对象,并通过反射该程 序集调用编译后的成员. 比较容易理解的一种解释就是类似于SqlServer中的 Exec ('select * from [table]')

java笔记十一:动态编译

JDK6.0推出了动态编译的新功能,能够在程序中动态的写一个类,再对之进行编译.编译成class文件后就可以通过类加载方式把动态编译的类加载到内存中.当然也能通过RunTime类调用javac命令来动态编译. 动态编译类的主要步骤: ①.写一个字符串,这个字符串就是要编译的类的全部内容. ②.通过输出流,把该字符串的内容写到工程下面指定的包中. ③.对创建的java文件进行编译. 动态编译涉及的类有JavaCompiler.StandardJavaFileManager,具体如何编译看下面的例子

详解利用 JDK6 动态编译组件搭建 OSGi 运行时编译环境

但是我们知道,在开发 OSGi 环境下的 Bundle 时最麻烦的步骤之一就是搭建编译环境.即便利用 Eclipse 这样高效的 开发工具,由于 Bundle 个数的庞大以及同一 Bundle 的版本多样性,维护一个编译环境变得非常繁琐.常常我们需要对一 个 OSGi 的 Bundle 进行二次开发时,仅仅一个很小的改动都需要花大量的时间去搭建专为这套程序的编译环境.我们迫切 希望可以有一个运行时的编译环境来简化这些步骤,利用环境既有的依赖项来对代码进行编译. 本篇文章介绍 OSGi 的运行特性

.NET的动态编译与WS服务调用详解

这篇文章介绍了.NET的动态编译与WS服务调用详解,有需要的朋友可以参考一下,希望对你有所帮助       动态编译与WS服务,有关系么?今天就乱弹一番,如何使用动态编译动态生成WS服务调用的代理类,然后通过这个代理类调用WS服务.     首先,动态编译这玩意在.NET里面是非常简单的,实际上只涉及到两个类型:CodeDomProvider以及CompilerParameters他们都位于System.CodeDom.Compiler命名空间.     以下代码可将源码动态编译为一个程序集:

深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)

Microsoft 的Visual Studio为我们在应用开发中提供的强大功能,我们是有目共睹.借助该工具,是我们的开发 显得更加高效而轻松.从Microsoft把这个IDE的名字从VS.NET 该为VS(比如原来的Visual Studio.NET 2003,现在的版本叫VS2005),可以MS对该IDE的期望和野心:MS要把它改造成一个万能的IDE.不过任何都有其两面性,对于我们广大的开发者来说,VS是我们的各种行为简单化,傻瓜化:但是在另一方面,他也会蒙蔽我们的眼睛,使我们对它背后做的事

静态编译与动态编译

静态编译与动态编译的区别 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令.所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源.缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库:二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行. 静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,

java动态编译加载类问题

问题描述 今天看到这个http://www.infoq.com/cn/articles/cf-java-byte-code想试一试,但是编译通过之后的,想执行结果那,总是不成功.现在将代码贴上,望大神指点!package com.deep.byteOpera;import java.io.IOException;import java.lang.reflect.Method;import java.net.URI;import java.net.URISyntaxException;import