1using System;
2using System.CodeDom;
3using System.CodeDom.Compiler;
4using Microsoft.CSharp;
5using System.IO;
6
7namespace CodeDomFacade
8{
9 /**//// <summary>
10 /// 该类封装了CodeCom相关操作,方便外部使用
11 /// </summary>
12 public class CodeDomHelper
13 {
14
15 protected CodeCompileUnit _CodeRoot;
16 protected CodeNamespace _cn;
17 protected CodeDomProvider _provider;
18 protected string _strFileName;
19 protected CodeTypeDeclaration _ctdClass;
20
21 public CodeDomHelper()
22 {
23 _CodeRoot=new CodeCompileUnit();
24 _ctdClass=new CodeTypeDeclaration();
25 }
26
27 /**//// <summary>
28 /// 生成代码输出到文件
29 /// </summary>
30 public void GenerateCode()
31 {
32 try
33 {
34 // Obtain an ICodeGenerator from a CodeDomProvider class.
35 ICodeGenerator gen = _provider.CreateGenerator();
36 // Create a TextWriter to a StreamWriter to an output file.
37 IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(_strFileName, false), " ");
38 // Generate source code using the code generator.
39 gen.GenerateCodeFromCompileUnit(_CodeRoot, tw, new CodeGeneratorOptions());
40 // Close the output file.
41 tw.Close();
42 }
43 catch(System.Exception e)
44 {
45 throw e;
46 }
47 }
48
49 /**//// <summary>
50 /// 生成C#代码
51 /// </summary>
52 public void GenerateCSharpCode()
53 {
54 _provider=new CSharpCodeProvider();//设定生成代码为C#代码
55 GenerateCode();//生成代码,写入指定文件
56 }
57 /**//// <summary>
58 /// 设置代码命名空间
59 /// </summary>
60 /// <param name="name">命名空间名字</param>
61 public void DefineNameSpace(string name)
62 {
63 try
64 {
65 _cn=new CodeNamespace(name);
66 _CodeRoot.Namespaces.Add(_cn);
67 }
68 catch(System.Exception e)
69 {
70 throw e;
71 }
72 }
73
74 /**//// <summary>
75 /// 添加引用命名空间
76 /// </summary>
77 /// <param name="name">被引用命名空间名字</param>
78 public void AddImportNameSpace(string name)
79 {
80 try
81 {
82 _cn.Imports.Add(new CodeNamespaceImport(name));
83 }
84 catch(System.Exception e)
85 {
86 throw e;
87 }
88 }
89
90 /**//// <summary>
91 /// 添加一个类
92 /// </summary>
93 /// <param name="classname">类名</param>
94 public void AddClass(string classname)
95 {
96 try
97 {
98 _ctdClass.Name=classname;
99 _cn.Types.Add(_ctdClass);
100 }
101 catch(System.Exception e)
102 {
103 throw e;
104 }
105 }
106
107 /**//// <summary>
108 /// 添加一个方法到类
109 /// </summary>
110 /// <param name="methodname">方法名</param>
111 /// <param name="returntype">返回值类型,如"System.Int32"</param>
112 /// <param name="visit">访问控制类型"public" or "private"</param>
113 public CodeMemberMethod AddMethod(string methodname,string returntype,string visit)
114 {
115 CodeMemberMethod cmm=new CodeMemberMethod();
116 try
117 {
118 cmm.Name=methodname;
119 cmm.ReturnType =new CodeTypeReference(returntype);
120 switch(visit)
121 {
122 case "public":
123 cmm.Attributes=MemberAttributes.Public|MemberAttributes.Final;
124 break;
125 case "private":
126 cmm.Attributes=MemberAttributes.Private|MemberAttributes.Final;
127 break;
128 default:
129 cmm.Attributes=MemberAttributes.Private|MemberAttributes.Final;
130 break;
131 }
132
133 _ctdClass.Members.Add(cmm);
134 }
135 catch(System.Exception e)
136 {
137 throw e;
138 }
139 return cmm;
140 }
141
142 /**//// <summary>
143 /// 添加带有普通的get/set操作属性
144 /// </summary>
145 /// <param name="pname">属性名</param>
146 /// <param name="returntype">返回值类型</param>
147 /// <param name="visit">访问控制类型</param>
148 /// <param name="fieldname">访问字段名</param>
149 /// <returns>返回添加的属性,待以后操作,如添加原代码段</returns>
150 public CodeMemberProperty AddProperty(string pname,string returntype,string visit,string fieldname)
151 {
152 CodeMemberProperty cmp=new CodeMemberProperty();
153 try
154 {
155 cmp.Name=pname;
156 cmp.Type=new CodeTypeReference(returntype);
157 switch(visit)
158 {
159 case "public":
160 cmp.Attributes=MemberAttributes.Public|MemberAttributes.Final;
161 break;
162 case "private":
163 cmp.Attributes=MemberAttributes.Private|MemberAttributes.Final;
164 break;
165 <
2using System.CodeDom;
3using System.CodeDom.Compiler;
4using Microsoft.CSharp;
5using System.IO;
6
7namespace CodeDomFacade
8{
9 /**//// <summary>
10 /// 该类封装了CodeCom相关操作,方便外部使用
11 /// </summary>
12 public class CodeDomHelper
13 {
14
15 protected CodeCompileUnit _CodeRoot;
16 protected CodeNamespace _cn;
17 protected CodeDomProvider _provider;
18 protected string _strFileName;
19 protected CodeTypeDeclaration _ctdClass;
20
21 public CodeDomHelper()
22 {
23 _CodeRoot=new CodeCompileUnit();
24 _ctdClass=new CodeTypeDeclaration();
25 }
26
27 /**//// <summary>
28 /// 生成代码输出到文件
29 /// </summary>
30 public void GenerateCode()
31 {
32 try
33 {
34 // Obtain an ICodeGenerator from a CodeDomProvider class.
35 ICodeGenerator gen = _provider.CreateGenerator();
36 // Create a TextWriter to a StreamWriter to an output file.
37 IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(_strFileName, false), " ");
38 // Generate source code using the code generator.
39 gen.GenerateCodeFromCompileUnit(_CodeRoot, tw, new CodeGeneratorOptions());
40 // Close the output file.
41 tw.Close();
42 }
43 catch(System.Exception e)
44 {
45 throw e;
46 }
47 }
48
49 /**//// <summary>
50 /// 生成C#代码
51 /// </summary>
52 public void GenerateCSharpCode()
53 {
54 _provider=new CSharpCodeProvider();//设定生成代码为C#代码
55 GenerateCode();//生成代码,写入指定文件
56 }
57 /**//// <summary>
58 /// 设置代码命名空间
59 /// </summary>
60 /// <param name="name">命名空间名字</param>
61 public void DefineNameSpace(string name)
62 {
63 try
64 {
65 _cn=new CodeNamespace(name);
66 _CodeRoot.Namespaces.Add(_cn);
67 }
68 catch(System.Exception e)
69 {
70 throw e;
71 }
72 }
73
74 /**//// <summary>
75 /// 添加引用命名空间
76 /// </summary>
77 /// <param name="name">被引用命名空间名字</param>
78 public void AddImportNameSpace(string name)
79 {
80 try
81 {
82 _cn.Imports.Add(new CodeNamespaceImport(name));
83 }
84 catch(System.Exception e)
85 {
86 throw e;
87 }
88 }
89
90 /**//// <summary>
91 /// 添加一个类
92 /// </summary>
93 /// <param name="classname">类名</param>
94 public void AddClass(string classname)
95 {
96 try
97 {
98 _ctdClass.Name=classname;
99 _cn.Types.Add(_ctdClass);
100 }
101 catch(System.Exception e)
102 {
103 throw e;
104 }
105 }
106
107 /**//// <summary>
108 /// 添加一个方法到类
109 /// </summary>
110 /// <param name="methodname">方法名</param>
111 /// <param name="returntype">返回值类型,如"System.Int32"</param>
112 /// <param name="visit">访问控制类型"public" or "private"</param>
113 public CodeMemberMethod AddMethod(string methodname,string returntype,string visit)
114 {
115 CodeMemberMethod cmm=new CodeMemberMethod();
116 try
117 {
118 cmm.Name=methodname;
119 cmm.ReturnType =new CodeTypeReference(returntype);
120 switch(visit)
121 {
122 case "public":
123 cmm.Attributes=MemberAttributes.Public|MemberAttributes.Final;
124 break;
125 case "private":
126 cmm.Attributes=MemberAttributes.Private|MemberAttributes.Final;
127 break;
128 default:
129 cmm.Attributes=MemberAttributes.Private|MemberAttributes.Final;
130 break;
131 }
132
133 _ctdClass.Members.Add(cmm);
134 }
135 catch(System.Exception e)
136 {
137 throw e;
138 }
139 return cmm;
140 }
141
142 /**//// <summary>
143 /// 添加带有普通的get/set操作属性
144 /// </summary>
145 /// <param name="pname">属性名</param>
146 /// <param name="returntype">返回值类型</param>
147 /// <param name="visit">访问控制类型</param>
148 /// <param name="fieldname">访问字段名</param>
149 /// <returns>返回添加的属性,待以后操作,如添加原代码段</returns>
150 public CodeMemberProperty AddProperty(string pname,string returntype,string visit,string fieldname)
151 {
152 CodeMemberProperty cmp=new CodeMemberProperty();
153 try
154 {
155 cmp.Name=pname;
156 cmp.Type=new CodeTypeReference(returntype);
157 switch(visit)
158 {
159 case "public":
160 cmp.Attributes=MemberAttributes.Public|MemberAttributes.Final;
161 break;
162 case "private":
163 cmp.Attributes=MemberAttributes.Private|MemberAttributes.Final;
164 break;
165 <