CodeTypeDeclaration,CodeMemberProperty动态生成代码

  1         由于是CodeDom些列,所以先介绍几个CodeDom表达式:
  2
  3 1:CodeConditionStatement:判断语句即是if(condition){} else{},看最全的那个构造函数:
  4
  5 public CodeConditionStatement(
  6 CodeExpression condition,//条件
  7 CodeStatement[] trueStatements,//为true的语句体
  8 CodeStatement[] falseStatements//为false语句体
  9 )
 10 2:CodeIterationStatement():表示 for 语句或语句块内的循环(使用测试表达式作为继续循环的条件):
 11 在codedom中没有提高while和dowhile但是For已经够用的
 12 public CodeIterationStatement(
 13 CodeStatement initStatement,//for初始化
 14 CodeExpression testExpression,//条件表达式
 15 CodeStatement incrementStatement,//for变化体,增或减
 16 CodeStatement[] statements//循环体
 17 )
 18 3:CodeBinaryOperatorExpression:表示一个表达式,该表达式包含在两个表达式间进行的二进制运算,
 19 public CodeBinaryOperatorExpression(
 20 CodeExpression left,//表达式左边
 21 CodeBinaryOperatorType op,//操作符
 22 CodeExpression right//表达式右边
 23 )
 24 4:CodeArrayIndexerExpression:表示对数组的索引的引用:
 25 public CodeArrayIndexerExpression(
 26 CodeExpression targetObject,//数组对象
 27 CodeExpression[] indices//下标
 28 )
 29 其他参见CodeDOM 快速参考:msdn.microsoft.com/zh-cn/library/f1dfsbhc(VS.80).aspx
 30 code:
 31 public CodeNamespace CreateNameSpace()
 32         {
 33 public CodeNamespace CreateNameSpace()
 34         {
 35             //Test
 36             CodeMemberMethod test = new CodeMemberMethod();
 37             test.Name = "Test";
 38             test.Attributes = MemberAttributes.Public | MemberAttributes.Final;
 39             test.Statements.Add(new CodeVariableDeclarationStatement(typeof(char[]), "ch",
 40             new CodeMethodInvokeExpression(new CodePrimitiveExpression("+ - + - + + - -"), "ToCharArray",
 41             new CodeExpression[] { })));
 42             test.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression
 43             (new CodeThisReferenceExpression(), "FuHaoSanJiao"), new CodeExpression[] { new CodeVariableReferenceExpression("ch"),
 44  new CodePrimitiveExpression(0) }));
 45             test.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), "Read"));
 46             //FuHaoSanJiao
 47             CodeMemberMethod fuHaoSanJiao = new CodeMemberMethod();
 48             fuHaoSanJiao.Name = "FuHaoSanJiao";
 49             fuHaoSanJiao.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(char[])),
 50             "ch"));
 51             fuHaoSanJiao.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(int)), "start"));
 52             fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"),
 53             "WriteLine", new CodeExpression[] { new CodeObjectCreateExpression(typeof(string), new CodeArgumentReferenceExpression("ch")) }));
 54             fuHaoSanJiao.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(
 55             new CodeArgumentReferenceExpression("start"), CodeBinaryOperatorType.GreaterThanOrEqual,
 56             (new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(
 57             new CodeArgumentReferenceExpression("ch"), "Length"),
 58             CodeBinaryOperatorType.Divide, new CodePrimitiveExpression(2)))),
 59             new CodeMethodReturnStatement()));
 60             CodeBinaryOperatorExpression condition = new CodeBinaryOperatorExpression(
 61             new CodeVariableReferenceExpression("i"),
 62             CodeBinaryOperatorType.LessThan,
 63             new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("ch"), "Length"),
 64             CodeBinaryOperatorType.Subtract, new CodeArgumentReferenceExpression("start")), CodeBinaryOperatorType.Subtract,
 65             new CodePrimitiveExpression(1)));//for 条件
 66             CodeConditionStatement iterationBody = new CodeConditionStatement(new CodeBinaryOperatorExpression(
 67             new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
 68             new CodeVariableReferenceExpression("i")),
 69             CodeBinaryOperatorType.IdentityEquality, new CodeArrayIndexerExpression(
 70             new CodeArgumentReferenceExpression("ch"),
 71             new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"),
 72              CodeBinaryOperatorType.Add, new CodePrimitiveExpression(2)))),
 73             new CodeAssignStatement(
 74             new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
 75             new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
 76             new CodePrimitiveExpression(1))),
 77             new CodePrimitiveExpression(‘+‘)));
 78             iterationBody.FalseStatements.Add(new CodeAssignStatement(
 79             new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
 80             new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
 81             new CodePrimitiveExpression(1))),
 82             new CodePrimitiveExpression(‘-‘)));
 83             CodeAssignStatement iteerationbody2 = new CodeAssignStatement(new CodeArrayIndexerExpression(
 84             new CodeArgumentReferenceExpression("ch"), new CodeVariableReferenceExpression("i")),
 85             new CodePrimitiveExpression(‘ ‘));
 86             fuHaoSanJiao.Statements.Add(new CodeIterationStatement(new CodeVariableDeclarationStatement(typeof(int),
 87             "i", new CodeArgumentReferenceExpression("start")), condition,
 88             new CodeAssignStatement(new CodeVariableReferenceExpression("i"), new CodeBinaryOperatorExpression(
 89             new CodeVariableReferenceExpression("i"), CodeBinaryOperatorType.Add,
 90             new CodePrimitiveExpression(2))), new CodeStatement[] { iterationBody, iteerationbody2 }));
 91             // ch[ch.Length - start - 1] = ‘ ‘;
 92             fuHaoSanJiao.Statements.Add(new CodeAssignStatement(
 93             new CodeArrayIndexerExpression(new CodeArgumentReferenceExpression("ch"),
 94             new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(
 95             new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("ch"), "Length"),
 96             CodeBinaryOperatorType.Subtract, new CodeArgumentReferenceExpression("start")),
 97              CodeBinaryOperatorType.Subtract,
 98             new CodePrimitiveExpression(1))), new CodePrimitiveExpression(‘ ‘)));
 99             //  FuHaoSanJiao(ch, start + 1);
100             fuHaoSanJiao.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(),
101             "FuHaoSanJiao", new CodeArgumentReferenceExpression("ch"),
102             new CodeBinaryOperatorExpression(new CodeArgumentReferenceExpression("start"),
103              CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));
104             CodeTypeDeclaration codeDomDemo2 = new CodeTypeDeclaration("CodeDomDemo2");
105             codeDomDemo2.Members.Add(test);
106             codeDomDemo2.Members.Add(fuHaoSanJiao);
107             codeDomDemo2.Attributes = MemberAttributes.Public;
108             codeDomDemo2.Comments.Add(new CodeCommentStatement("this code is from CodeDom!"));
109             //codeDomDemo2.Members.AddRange();
110             CodeNamespace nspace = new CodeNamespace("CodeDomDemo2");
111             nspace.Imports.Add(new CodeNamespaceImport("System"));
112             nspace.Types.Add(codeDomDemo2);
113             return nspace;
114         }
115     }
116 }
117 输出代码为 :
118
119 namespace CodeDomDemo2
120 {
121     using System;
122     // this code is from CodeDom!
123     public class CodeDomDemo2
124     {
125         public void Test()
126         {
127             char[] ch = "+ - + - + + - -".ToCharArray();
128             this.FuHaoSanJiao(ch, 0);
129             System.Console.Read();
130         }
131         private void FuHaoSanJiao(char[] ch, int start)
132         {
133             System.Console.WriteLine(new string(ch));
134             if ((start
135             >= (ch.Length / 2)))
136             {
137                 return;
138             }
139             for (int i = start; (i
140             < ((ch.Length - start)
141             - 1)); i = (i + 2))
142             {
143                 if ((ch[i] == ch[(i + 2)]))
144                 {
145                     ch[(i + 1)] = ‘+‘;
146                 }
147                 else
148                 {
149                     ch[(i + 1)] = ‘-‘;
150                 }
151                 ch[i] = ‘ ‘;
152             }
153             ch[((ch.Length - start)
154             - 1)] = ‘ ‘;
155             this.FuHaoSanJiao(ch, (start + 1));
156         }
157     }
158 }

原文地址:https://www.cnblogs.com/weifeng123/p/11398413.html

时间: 2024-10-17 08:54:51

CodeTypeDeclaration,CodeMemberProperty动态生成代码的相关文章

Emit动态生成代码

Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new AssemblyName("Kitty"); 从当前应用程序域获取程序集构造器, // create assembly builder var assemblyBuilder=AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyNam

动态生成代码中的事件注意事项

var d = '<a href="#" title="查看"  onclick ="ViewById(' + row.Id + ','+"'"+row.vpdm+"'"+')">' + value + '</a>'; "'"+row.vpdm+"'"这里要加上单引号,前面的row.Id是int所以不用,但后面的是字符串类型就得加上单引号,要不

Android 动态生成布局 (多层嵌套)

Android 除了可以加载xml文件,显示布局外,也可以代码生成布局,并通过setContentView(View view)方法显示布局.单独的一层布局,如一个主布局加一个控件(如Button\imageView等)动态生成代码比较简单,下面只给出示例代码: package com.example.android_dongtaishengcheng; import android.os.Bundle; import android.app.Activity; import android.c

在后台代码中动态生成pivot项并设置EventTrigger和Action的绑定

最近在做今日头条WP的过程中,遇到需要动态生成Pivot项的问题.第一个版本是把几个频道写死在xaml里了,事件绑定也写在xaml里,每个频道绑定一个ObservableCollection<ArticleItem>.xaml中一个Pivot项的代码大体如下: <phone:PivotItem Header="热点"> <Grid Margin="12,0,0,0" > <Grid.RowDefinitions> &l

用js动态生成css代码

有时候我们需要利用js来动态生成页面上style标签中的css代码,方法很直接,就是直接创建一个style元素,然后设置style元素里面的css代码,最后把它插入到head元素中.但有些兼容性问题我们需要解决.首先在符合w3c标准的浏览器中我们只需要把要插入的css代码作为一个文本节点插入到style元素中即可,而在IE中则需要利用style元素的styleSheet.cssText来解决.还需要注意的就是在有些版本IE中一个页面上style标签数量是有限制的,如果超过了会报错,需要考虑这点.

如何根据动态SQL代码自动生成DTO

当前的状况 一般做数据库相关开发, 除非学习, 否则很少有人愿意直接使用JDBC.本来Java代码就比较啰嗦了,而直接用JDBC写代码之啰嗦简直有些令人发狂!所以在实际开发过程中,我们通常都会使用一些框架/库来帮助我们操作数据库.而且开源市场上的选择也比较多,就我个人接触到的有:Hibernate,MyBatis,JdbcTemplate,DbUtils,ActiveRecord,JavaLite等等. 这些框架都能大幅的提高开发效率,对于一些基本CRUD操作来说,虽然各有差异,但总的来说基本是

js动态生成css代码

用js动态生成css代码 有时候我们需要利用js来动态生成页面上style标签中的css代码,方法很直接,就是直接创建一个style元素,然后设置style元素里面的css代码,最后把它插入到head元素中.但有些兼容性问题我们需要解决.首先在符合w3c标准的浏览器中我们只需要把要插入的css代码作为一个文本节点插入到style元素中即可,而在IE中则需要利用style元素的styleSheet.cssText来解决.还需要注意的就是在有些版本IE中一个页面上style标签数量是有限制的,如果超

jquery动态生成html代码绑定事件

今天工作中需要在页面动态生成html代码,但发现新生成的代码的click事件失效了(非动态生成的代码已经绑定了click事件),于是在网上找了很多解决办法,很多都比较复杂,且使用的jquery都比较老,于是结合网上加上自己的测试,找到了一种解决方法. 我使用的jquery是1.9.11,jquery1.7之后就将live方法废弃了,新增了on和off方法,我的解决办法就是使用on方法,首先看代码: <div class="h3"> <h3>李健1</h3&

winform WebBrowser控件中,cs后台代码执行动态生成的js

很多文章都是好介绍C# 后台cs和js如何交互,cs调用js方法(js方法必须是页面上存在的,已经定义好的),js调用cs方法, 但如果想用cs里面执行动态生成的js代码,如何实现呢? 思路大致是这样的,cs动态插入js到html上,cs执行html插入的js方法代码. 封装好的方法: /// <summary> /// webbrowser执行脚本 /// </summary> /// <param name="web">传入WebBrowser