CodeTypeDeclaration,CodeMemberProperty动态生成代码

Posted weifeng123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

 

以上是关于CodeTypeDeclaration,CodeMemberProperty动态生成代码的主要内容,如果未能解决你的问题,请参考以下文章

「题解」「美团 CodeM 资格赛」跳格子

CodeM - 5

CodeM资格赛2

CodeM - 6

CodeM - 4

CodeM资格赛5