CodeTypeDeclaration,CodeMemberProperty动态生成代码
由于是CodeDom些列,所以先介绍几个CodeDom表达式:
:CodeConditionStatement:判断语句即是if(condition){} else{},看最全的那个构造函数:
public CodeConditionStatement(
CodeExpression condition,//条件
CodeStatement[] trueStatements,//为true的语句体
CodeStatement[] falseStatements//为false语句体
)
:CodeIterationStatement():表示 for 语句或语句块内的循环(使用测试表达式作为继续循环的条件):
在codedom中没有提高while和dowhile但是For已经够用的
public CodeIterationStatement(
CodeStatement initStatement,//for初始化
CodeExpression testExpression,//条件表达式
CodeStatement incrementStatement,//for变化体,增或减
CodeStatement[] statements//循环体
)
:CodeBinaryOperatorExpression:表示一个表达式,该表达式包含在两个表达式间进行的二进制运算,
public CodeBinaryOperatorExpression(
CodeExpression left,//表达式左边
CodeBinaryOperatorType op,//操作符
CodeExpression right//表达式右边
)
:CodeArrayIndexerExpression:表示对数组的索引的引用:
public CodeArrayIndexerExpression(
CodeExpression targetObject,//数组对象
CodeExpression[] indices//下标
)
其他参见CodeDOM 快速参考:msdn.microsoft.com/zh-cn/library/f1dfsbhc(VS.).aspx
code:
public CodeNamespace CreateNameSpace()
{
public CodeNamespace CreateNameSpace()
{
//Test
CodeMemberMethod test = new CodeMemberMethod();
test.Name = "Test";
test.Attributes = MemberAttributes.Public | MemberAttributes.Final;
test.Statements.Add(new CodeVariableDeclarationStatement(typeof(char[]), "ch",
new CodeMethodInvokeExpression(new CodePrimitiveExpression("+ - + - + + - -"), "ToCharArray",
new CodeExpression[] { })));
test.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression
(new CodeThisReferenceExpression(), "FuHaoSanJiao"), new CodeExpression[] { new CodeVariableReferenceExpression("ch"),
new CodePrimitiveExpression() }));
test.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), "Read"));
//FuHaoSanJiao
CodeMemberMethod fuHaoSanJiao = new CodeMemberMethod();
fuHaoSanJiao.Name = "FuHaoSanJiao";
fuHaoSanJiao.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(char[])),
"ch"));
fuHaoSanJiao.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "start"));
fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"),
"WriteLine", new CodeExpression[] { new CodeObjectCreateExpression(typeof(string), new CodeArgumentReferenceExpression("ch")) }));
fuHaoSanJiao.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(
new CodeArgumentReferenceExpression("start"), CodeBinaryOperatorType.GreaterThanOrEqual,
(new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(
new CodeArgumentReferenceExpression("ch"), "Length"),
CodeBinaryOperatorType.Divide, new CodePrimitiveExpression()))),
new CodeMethodReturnStatement()));
CodeBinaryOperatorExpression condition = new CodeBinaryOperatorExpression(
new CodeVariableReferenceExpression("i"),
CodeBinaryOperatorType.LessThan,
new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("ch"), "Length"),
CodeBinaryOperatorType.Subtract, new CodeArgumentReferenceExpression("start")), CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression()));//for 条件
CodeConditionStatement iterationBody = new CodeConditionStatement(new CodeBinaryOperatorExpression(
new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
new CodeVariableReferenceExpression("i")),
CodeBinaryOperatorType.IdentityEquality, new CodeArrayIndexerExpression(
new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
CodeBinaryOperatorType.Add, new CodePrimitiveExpression()))),
new CodeAssignStatement(
new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
new CodePrimitiveExpression())),
new CodePrimitiveExpression('+')));
iterationBody.FalseStatements.Add(new CodeAssignStatement(
new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
new CodePrimitiveExpression())),
new CodePrimitiveExpression('-')));
CodeAssignStatement iteerationbody2 = new CodeAssignStatement(new CodeArrayIndexerExpression(
new CodeArgumentReferenceExpression("ch"), new CodeVariableReferenceExpression("i")),
new CodePrimitiveExpression(' '));
fuHaoSanJiao.Statements.Add(new CodeIterationStatement(new CodeVariableDeclarationStatement(typeof(int),
"i", new CodeArgumentReferenceExpression("start")), condition,
new CodeAssignStatement(new CodeVariableReferenceExpression("i"), new CodeBinaryOperatorExpression(
new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
new CodePrimitiveExpression())), new CodeStatement[] { iterationBody, iteerationbody2 }));
// ch[ch.Length - start - 1] = ' ';
fuHaoSanJiao.Statements.Add(new CodeAssignStatement(
new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(
new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("ch"), "Length"),
CodeBinaryOperatorType.Subtract, new CodeArgumentReferenceExpression("start")),
CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression())), new CodePrimitiveExpression(' ')));
// FuHaoSanJiao(ch, start + 1);
fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(),
"FuHaoSanJiao", new CodeArgumentReferenceExpression("ch"),
new CodeBinaryOperatorExpression(new CodeArgumentReferenceExpression("start"),
CodeBinaryOperatorType.Add, new CodePrimitiveExpression())));
CodeTypeDeclaration codeDomDemo2 = new CodeTypeDeclaration("CodeDomDemo2");
codeDomDemo2.Members.Add(test);
codeDomDemo2.Members.Add(fuHaoSanJiao);
codeDomDemo2.Attributes = MemberAttributes.Public;
codeDomDemo2.Comments.Add(new CodeCommentStatement("this code is from CodeDom!"));
//codeDomDemo2.Members.AddRange();
CodeNamespace nspace = new CodeNamespace("CodeDomDemo2");
nspace.Imports.Add(new CodeNamespaceImport("System"));
nspace.Types.Add(codeDomDemo2);
return nspace;
}
}
}
输出代码为 :
namespace CodeDomDemo2
{
using System;
// this code is from CodeDom!
public class CodeDomDemo2
{
public void Test()
{
char[] ch = "+ - + - + + - -".ToCharArray();
this.FuHaoSanJiao(ch, );
System.Console.Read();
}
private void FuHaoSanJiao(char[] ch, int start)
{
System.Console.WriteLine(new string(ch));
if ((start
>= (ch.Length / )))
{
return;
}
for (int i = start; (i
< ((ch.Length - start)
- )); i = (i + ))
{
if ((ch[i] == ch[(i + )]))
{
ch[(i + )] = '+';
}
else
{
ch[(i + )] = '-';
}
ch[i] = ' ';
}
ch[((ch.Length - start)
- )] = ' ';
this.FuHaoSanJiao(ch, (start + ));
}
}
}
CodeTypeDeclaration,CodeMemberProperty动态生成代码的更多相关文章
- Emit动态生成代码
Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new ...
- 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类
秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...
- 秒懂C#通过Emit动态生成代码
首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new AssemblyName("Kitty&qu ...
- Android 动态生成布局 (多层嵌套)
Android 除了能够载入xml文件,显示布局外,也能够代码生成布局,并通过setContentView(View view)方法显示布局.单独的一层布局,如一个主布局加一个控件(如Button\i ...
- 动态生成一个设定好特殊样式的Tlabel,快速生成代码
动态生成一个设定好特殊样式的Tlabel,快速生成代码: 1.自己先在可视化界面设定一个Label,像这样: 2.选择label,快捷键ctrl+C 复制,粘贴带代码编辑器去,会生成一段这样的窗体代码 ...
- 在后台代码中动态生成pivot项并设置EventTrigger和Action的绑定
最近在做今日头条WP的过程中,遇到需要动态生成Pivot项的问题.第一个版本是把几个频道写死在xaml里了,事件绑定也写在xaml里,每个频道绑定一个ObservableCollection<A ...
- 用js动态生成css代码
有时候我们需要利用js来动态生成页面上style标签中的css代码,方法很直接,就是直接创建一个style元素,然后设置style元素里面的css代码,最后把它插入到head元素中.但有些兼容性问题我 ...
- winform WebBrowser控件中,cs后台代码执行动态生成的js
很多文章都是好介绍C# 后台cs和js如何交互,cs调用js方法(js方法必须是页面上存在的,已经定义好的),js调用cs方法, 但如果想用cs里面执行动态生成的js代码,如何实现呢? 思路大致是这样 ...
- Java下的框架编程(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)
Java 虽然没有动态语言般暴起,但仍然天连天,水接水的生出好多框架技术---反射(reflection),泛型(generics),元数据(annotation),proxies(proxy/cgl ...
随机推荐
- java执行sql语句使用别名时显示Column '***' not found
java执行sql语句使用别名时显示Column '*' not found 在做一个小项目时遇到个问题,执行sql语句使用别名时总是报sql异常 Column '*' not found,折腾半天终 ...
- SharpDX初学者教程第1部分:在Visual Studio 2013中设置SharpDX项目
原文 http://www.johanfalk.eu/blog/sharpdx-tutorial-part-1-setting-up-a-sharpdx-project-in-visual-studi ...
- 模板—FFT
卷积:$C[i]=\sum \limits_{j=0}^{i}A[j]*B[i-j]$可以画图理解一下其实就是交叉相乘的和. 卷积可以看作两个多项式乘积的形式,只不过求出的结果的项数不同. FFT讲解 ...
- K8s中Pod健康检查源代码分析
了解k8s中的Liveness和Readiness Liveness: 表明是否容器正在运行.如果liveness探测为fail,则kubelet会kill掉容器,并且会触发restart设置的策略. ...
- 阿里云应用实时监控 ARMS 再升级,支持 Prometheus 开源生态
摘要: 应用实时监控服务 (ARMS) 是一款APM类的监控产品. 用户可基于 ARMS 的前端.应用.自定义监控,快速构建实时的应用性能和业务监控能力.ARMS 让所有性能问题“一屏了然”,不遗余力 ...
- P2993 [FJOI2014]最短路径树问题 点分治+最短路
这道题还是非常简单的,由于我们要保证最小字典序,因此我们需要把边进行排序,然后从大到小插入,因为链式前向星是倒着存的.我们只需要先跑一个最短路,然后查询边是不是在最短路上,这个可以通过枚举边并用 di ...
- linux 一些简单操作
vim ----三种模式 1.命令模式 2.输出模式 3.底线命令模式 w(e) 移动光标到下一个单词 b 移动到光标上一个单词 数字0 移动到本行开头 $ 移动光 ...
- Python--day72--SweetAlert插件
引用:http://www.cnblogs.com/liwenzhou/p/8718861.html 补充一个SweetAlert插件示例 点击下载Bootstrap-sweetalert项目. $( ...
- Python图表绘制Matplotlib
引入 import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 导入相关模块 使用 # 图表窗口1 → plt.sho ...
- [转]关于/r与/n 以及 /r/n 的区别总结
应该说还是区别的,\r就是回到行首,\n就是到下一行的,但是一般我们输出程序时,看不到明显的差别的 '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来 ...