dotnet 使用 IndentedTextWriter 辅助生成代码时生成带缩进的内容
随着源代码生成的越来越多的应用,自然也遇到了越来越多开发上的坑,例如源代码的缩进是一个绕不过去的问题。如果源代码生成是人类可见的代码,我期望生成的代码最好是比较符合人类编写代码的规范。为了能让人类在阅读机器生成的代码的时候,不会想着拿刀砍那个编写代码生成代码的开发者,最好,或者说至少代码也应该有个缩进和换行吧。本文将安利大家通过 IndentedTextWriter 这个辅助类,用来辅助生成带缩进的内容
使用 IndentedTextWriter 辅助类核心的用途在于自动加上缩进,缩进的等级由代码设置,可以通过加等和减等控制缩进等级。缩进等级是文本排版的概念,约等于缩进多少个空格
在开始使用 IndentedTextWriter 之前,需要先引用命名空间
using System.CodeDom.Compiler;
using System.Text;
初始化 IndentedTextWriter 需要传入一个 TextWriter 对象,用来当成写入输出的内容。有趣的是 IndentedTextWriter 类型自己也是继承 TextWriter 的类型,也就是可以用 IndentedTextWriter 类型进行无限套娃
大家都知道,继承 TextWriter 的类型用的多的有 StringWriter 和 StreamWriter 这两个。其中 StringWriter 用于辅助写入 StringBuilder 对象,基本输出限制在内存里面。而 StreamWriter 则是输出到 Stream 里,至于这个 Stream 是文件还是网络,那就看你的心情了
作为例子,咱使用 StringWriter 作为 IndentedTextWriter 的输出。对 IndentedTextWriter 写入的内容,最终将会写入到 StringBuilder 里面,初始化的代码如下
var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);
var indentedTextWriter = new IndentedTextWriter(stringWriter, " ");
在初始化 IndentedTextWriter 时,可选传入 tabString 参数,此参数表示用来表示缩进的字符串。例如缩进等级为 1 时,将在每个行之前写入 1 个传入的 tabString 参数字符串,如上文代码,就是写入一个空格。如果自己传入其他的参数,例如两个空格,那就表示一个缩进等级写入两个空格。如自己传入 - 就表示每个缩进传入的是 - 字符
通过 IndentedTextWriter.Indent 属性可以控制当前的缩进等级,例如以下代码设置缩进为 2 缩进等级
indentedTextWriter.Indent = 2;
试试在缩进前后写入内容,看看缩进对写入内容的影响
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent = 2;
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello");
Console.WriteLine(stringBuilder.ToString());
输出内容如下
Hello
Hello
Hello
Hello
通过加等和减等控制缩进等级,可以比较好的实现花括号的缩进,如以下代码
var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);
var indentedTextWriter = new IndentedTextWriter(stringWriter, " ");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent = 2;
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent += 2;
indentedTextWriter.WriteLine("{");
indentedTextWriter.Indent += 4;
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent -= 2;
indentedTextWriter.WriteLine("Hello");
indentedTextWriter.Indent -= 2;
indentedTextWriter.WriteLine("}");
indentedTextWriter.Indent -= 2;
Console.WriteLine(stringBuilder.ToString());
输出内容如下
Hello
Hello
Hello
Hello
{
Hello
Hello
Hello
}
由于 IndentedTextWriter 的构造函数可以让缩进采用除了空格之外的其他字符串内容,这就可以让大家更加开森,可以将 IndentedTextWriter 用来除代码之外的其他生成内容里
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin e54d3f45986ff8200d8601cd8dc0bedc81924d75
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin e54d3f45986ff8200d8601cd8dc0bedc81924d75
获取代码之后,进入 HoyebenawlerWegemnardicheba 文件夹
dotnet 使用 IndentedTextWriter 辅助生成代码时生成带缩进的内容的更多相关文章
- mybatis-generator自动生成代码时,只生成insert方法
今天使用mybatis-generator自动生成代码时,发现只能生成insert方法, 以前所有的方法都是可以生成的,查看网上解决办法和检查数据库表结构后, 发现2种可以解决的办法: 1.修改myb ...
- mybatis generator自动生成代码时 只生成了insert 而没有其他的
mybatis框架提供了非常好用的逆向工程插件,但是在使用过程中会有很多问题. 我在使用中就遇到了只生成insert和insertSeletive方法,而不生成其他根据primary key查询更新删 ...
- mybatis使用generator自己主动生成代码时的类型转换
使用mybatis的generator自己主动生成代码,可是oracle数据库中number(6,2)总是自己主动转成BigDecimal.我想要转成的是float类型 这样就写了一个类型转换器,须要 ...
- 2016.7.12 eclispe使用mybatis generator生成代码时提示project E is not exist
运行mybatis-generator之后,出现错误:project E is not exist 错误原因:使用了项目的绝对路径. http://bbs.csdn.net/topics/3914 ...
- MVC Code First 自动生成数据库时生成的表名会多了一个s
如图:我的类文件都是不带s的
- PyCharm新建.py文件时自动带出指定内容
如:给Pycharm加上头行 # coding:utf-8File—Setting—Editor--Code Style--File and Code Templates--Python Scrip ...
- java如何在eclipse编译时自动生成代码
用eclipse写java代码,自动编译时,如何能够触发一个动作,这个动作是生成本项目的代码,并且编译完成后,自动生成的代码也编译好了, java编辑器中就可以做到对新生成的代码的自动提示? 不生成代 ...
- 使用 T4 文本模板生成设计时代码
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的 ...
- 使用mybatis-generator生成代码
文档地址: http://mbg.cndocs.tk/index.html 以下是一个简单的配置内容. 一.在maven配置文件中添加mybatis-generator插件 1 2 3 4 5 ...
- mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap--转
转自:http://blog.csdn.net/tan3739/article/details/7555665 Exception in thread "main" Java.la ...
随机推荐
- Lab2:System Call
trace 该系统调用程序,可以跟踪其他的系统调用命令,该系统调用的形参为一个整数掩码.其具体实参为1 << sys_call所得到的整数值,sys_call是一个系统调用指令在内核中定义 ...
- 从优秀到卓越:成为DevOps专家的7项软技能
在我的职业生涯中,遇见过许多专业人士,他们在技术上非常健全,对自己的领域和技术有很好的掌握和专业知识,但是由于缺乏软技能,他们错过了晋升.现场机会.高级技术面试以及职业生涯中的机会.很震惊吧,技术好却 ...
- VK2C21A:抗干扰/抗噪/高稳定性LCD屏显示驱动,抗干扰LCD驱动段码屏芯片
产品型号:VK2C21A/B/C/D 产品品牌:VINKA/永嘉微/永嘉微电 封装形式:SOP28/24/20/16 产品年份:新年份 原厂直销,工程服务,技术支持,价格最具优势! VK2C21A/B ...
- OpenAtom OpenHarmony分论坛,今天14:00见!附大事记精彩发布
2022开放原子全球开源峰会 OpenAtom OpenHarmony分论坛 万物互联,使能千行百业 整装待发!精彩今日揭晓与您相约7月27日 14:00
- 攻防世界Reverse三星题 zorropub
题目 分析过程 丢到PE里面,无壳,64bit 丢到IDA里面,查看mian函数 1 int __fastcall main(int a1, char **a2, char **a3) 2 { 3 s ...
- Rancher 系列文章-K3S 集群升级
概述 书接上回:<Rancher 系列文章-Rancher 升级>, 我们提到:将 Rancher 用 Helm 从 v2.6.3 升级到 v2.6.4. 接下来开始进行 K3S 集群的升 ...
- K8S 性能优化 - K8S APIServer 调优
前言 K8S 性能优化系列文章,本文为第二篇:Kubernetes API Server 性能优化参数最佳实践. 系列文章: <K8S 性能优化 - OS sysctl 调优> 参数一览 ...
- 94个JS/eTS开源组件首发上新,肯定有你要用的一款!
原文:https://mp.weixin.qq.com/s/6RdxNisTQoyPds811PNZKA,点击链接查看更多技术内容. 2021年的华为开发者大会(HDC2021)上,我们发布了新一代的 ...
- 面试连环炮系列(二十六):什么情况下JVM频繁发生full GC
1. 什么情况下JVM频繁发生full GC? full gc触发条件是老年代空间不足,具体原因有四个: 系统并发高.执行耗时长或者创建对象过多,导致 young gc频繁,且gc后存活对象太多,但是 ...
- 带你走进红帽企业级 Linux 6体验之旅(安装篇)
红帽在11月10日发布了其企业级Linux,RHEL 6的正式版(51CTO编辑注:红帽官方已经不用RHEL这个简称了,其全称叫做Red Hat Enterprise Linux).新版带来了将近18 ...