CodeDom系列四--Code生成
2010-07-05 09:19 破狼 阅读(5646) 评论(15) 编辑 收藏 举报我们利用CodeDom技术生成了一些列Codedom Expression ,接下来的任务就是编译和生成,生成c#、Vb或者是.NET平台支持语言,编译程序集(dll或者是exe)。
CodeDomProvider:在2.0后提供了CodeDomProvider.CreateProvider(string language)的工厂类,取代以前的
Microsoft.VisualBasic.VBCodeProvider、 Microsoft.CSharp.CSharpCodeProvider的创建CodeDomProvider的方式,现在我们可以仅用一句CodeDomProvider.CreateProvider("c#")方式就可以创建CSharpCodeProvider。有了CodeDomProvider我们就可以利用Provider生成对应语言的源代码:ICodeGenerator :代码生成抽象,可以用provider.CreateGenerator()取得;这个类给我提供了代码生成的方法有:
GenerateCodeFromCompileUnit:从编译单元生成code
GenerateCodeFromExpression:从表达式生成code
GenerateCodeFromMember:从类型成员Member生成code
GenerateCodeFromNamespace:从命名空间生成code
GenerateCodeFromStatement:从statement语句生成code
GenerateCodeFromType:从类型Type生成code。其实在CodeDomProvider也通过了同样的方法,个人习惯于用CodeDomProvider的方法。
他们都有个共同的参数就是生成参数:CodeGeneratorOptions。在CodeGeneratorOptions里提供了code生成时的选项BlankLinesBetweenMembers:获取或设置一个值,该值指示是否在成员之间插入空行。
BracingStyle:获取或设置用于大括号的样式。此属性的默认值为 Block,该值指示在生成代码时,使大括号从关联的语句或声明所在的行开始。C 属性值指示大括号从关联的语句或声明的后面一行开始。
ElseOnClosing:获取或设置一个值,该值指示是否在前面每个 if 或 try 块的结束行处追加 else、catch 或 finally 块(包括括号)。
IndentString:获取或设置用于缩进的字符串。
Item:获取或设置指定索引处的对象。
VerbatimOrder:获取或设置一个值,该值指示是否按成员在成员集合中出现的顺序生成成员。还有就是System.IO.TextWriter的参数,这个参数我们可以通过输出File文件的StreamWrite或者是StringBuilder的StringWrite。故名思意,其输出的方式和位置不同。
例如:
CodeGeneratorOptions geneOptions = new CodeGeneratorOptions();//代码生成选项
geneOptions.BlankLinesBetweenMembers = false;
geneOptions.BracingStyle = "C"; // C风格
geneOptions.ElseOnClosing = true;
geneOptions.IndentString = " ";
这里代码生成的全部就完成了,我们来一个简单的担待生成Demo:功能就是输出一句话:
System.Console.WriteLine("Tes tCodeDom Generate!")
456789101112131415161718192021public
static
void
TestCodeDomGenerate()
{
//CodeGeneratorOptions
CodeGeneratorOptions geneOptions =
new
CodeGeneratorOptions();
//代码生成选项
geneOptions.BlankLinesBetweenMembers =
false
;
geneOptions.BracingStyle =
"C"
;
geneOptions.ElseOnClosing =
true
;
geneOptions.IndentString =
" "
;
//TextWrite
StringBuilder sb=
new
StringBuilder();
System.IO.StringWriter sw=
new
System.IO.StringWriter(sb);
CodeMethodInvokeExpression mehtodinvoke =
new
CodeMethodInvokeExpression(
new
CodeTypeReferenceExpression(
"System.Console"
),
45678910"WriteLine"
,
new
CodePrimitiveExpression(
"Tes tCodeDom Generate!"
));
CodeDomProvider.CreateProvider(
"c#"
).GenerateCodeFromExpression(mehtodinvoke,sw,geneOptions);
sw.Close();
Console.WriteLine(sb.ToString());
}
运行结果:
4 | |
作者:破 狼
出处:http://www.cnblogs.com/whitewolf/
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架