1
using System;
2
using System.CodeDom;
3
using System.CodeDom.Compiler;
4
using Microsoft.CSharp;
5
using System.IO;
6![]()
7
namespace 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
default:
166
cmp.Attributes=MemberAttributes.Private|MemberAttributes.Final;
167
break;
168
}
169
//添加get操作代码
170
cmp.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),fieldname)));
171
//添加set操作代码
172
cmp.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),fieldname),new CodePropertySetValueReferenceExpression()));
173
_ctdClass.Members.Add(cmp);
174
}
175
catch(System.Exception e)
176
{
177
throw e;
178
}
179
return cmp;
180
}
181![]()
182
/// <summary>
183
/// 添加字段
184
/// </summary>
185
/// <param name="name">字段名</param>
186
/// <param name="type">字段类型</param>
187
/// <param name="visit">访问控制类型</param>
188
/// <param name="IsCreateProperty">是否生成对应属性</param>
189
public void AddField(string name,string type,string visit,bool IsCreateProperty)
190
{
191
CodeMemberField cmf=new CodeMemberField(type,name);
192
try
193
{
194
switch(visit)
195
{
196
case "public":
197
cmf.Attributes=MemberAttributes.Public|MemberAttributes.Final;
198
break;
199
case "private":
200
cmf.Attributes=MemberAttributes.Private|MemberAttributes.Final;
201
break;
202
default:
203
cmf.Attributes=MemberAttributes.Private|MemberAttributes.Final;
204
break;
205
}
206
_ctdClass.Members.Add(cmf);
207
if(IsCreateProperty)
208
{
209
if(name.IndexOf("_")>0)
210
AddProperty(name.Replace("_",""),type,"public",name);
211
else
212
AddProperty("p" + name,type,"public",name);
213
}
214
}
215
catch(System.Exception e)
216
{
217
throw e;
218
}
219
}
220![]()
221
/// <summary>
222
/// 从指定文件获取代码
223
/// </summary>
224
/// <param name="filename">文件路径(包含名称)</param>
225
/// <returns></returns>
226
public string GetCodeFormFile(string filename)
227
{
228
try
229
{
230
StreamReader sr = new StreamReader(filename);
231
string result = sr.ReadToEnd();//读取文件内容到文本框
232
sr.Close();
233
return result;
234
}
235
catch(System.Exception e)
236
{
237
throw e;
238
return "读取文件出错";
239
}
240
}
241![]()
242
/// <summary>
243
/// 添加原代码片断
244
/// </summary>
245
/// <param name="cmm">要添加的地方,如方法,入口点,结构等</param>
246
/// <param name="strCode">具体代码</param>
247
public void AddCodeSnippet(CodeMemberMethod cmm,string strCode)
248
{
249
try
250
{
251
CodeSnippetStatement codebody = null;
252
codebody = new CodeSnippetStatement(strCode);
253
cmm.Statements.Add(codebody);
254
}
255
catch(System.Exception e)
256
{
257
throw e;
258
}
259
}
260
相关属性
321
}
322
}
323![]()
最近在看CodeDom,发现其类层次很多,而且很复杂,所以写了一个Farade模式的类,希望在以后的开发中简化使用CodeDom,但由于时间有限,所以功能不够完善,也许要在以后使用中不断完善。
using System;2
using System.CodeDom;3
using System.CodeDom.Compiler;4
using Microsoft.CSharp;5
using System.IO;6

7
namespace CodeDomFacade8
{9
/// <summary>10
/// 该类封装了CodeCom相关操作,方便外部使用11
/// </summary>12
public class CodeDomHelper13
{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
try33
{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
try64
{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
try81
{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
try97
{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
try117
{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
try154
{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
default:166
cmp.Attributes=MemberAttributes.Private|MemberAttributes.Final; 167
break;168
}169
//添加get操作代码170
cmp.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),fieldname)));171
//添加set操作代码172
cmp.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),fieldname),new CodePropertySetValueReferenceExpression()));173
_ctdClass.Members.Add(cmp);174
}175
catch(System.Exception e)176
{177
throw e;178
}179
return cmp;180
}181

182
/// <summary>183
/// 添加字段184
/// </summary>185
/// <param name="name">字段名</param>186
/// <param name="type">字段类型</param>187
/// <param name="visit">访问控制类型</param>188
/// <param name="IsCreateProperty">是否生成对应属性</param>189
public void AddField(string name,string type,string visit,bool IsCreateProperty)190
{191
CodeMemberField cmf=new CodeMemberField(type,name);192
try193
{194
switch(visit)195
{196
case "public":197
cmf.Attributes=MemberAttributes.Public|MemberAttributes.Final; 198
break;199
case "private":200
cmf.Attributes=MemberAttributes.Private|MemberAttributes.Final; 201
break;202
default:203
cmf.Attributes=MemberAttributes.Private|MemberAttributes.Final; 204
break;205
}206
_ctdClass.Members.Add(cmf);207
if(IsCreateProperty)208
{209
if(name.IndexOf("_")>0)210
AddProperty(name.Replace("_",""),type,"public",name);211
else212
AddProperty("p" + name,type,"public",name);213
}214
}215
catch(System.Exception e)216
{217
throw e;218
}219
}220

221
/// <summary>222
/// 从指定文件获取代码223
/// </summary>224
/// <param name="filename">文件路径(包含名称)</param>225
/// <returns></returns>226
public string GetCodeFormFile(string filename)227
{228
try229
{230
StreamReader sr = new StreamReader(filename);231
string result = sr.ReadToEnd();//读取文件内容到文本框232
sr.Close();233
return result;234
}235
catch(System.Exception e)236
{237
throw e;238
return "读取文件出错";239
}240
}241

242
/// <summary>243
/// 添加原代码片断244
/// </summary>245
/// <param name="cmm">要添加的地方,如方法,入口点,结构等</param>246
/// <param name="strCode">具体代码</param>247
public void AddCodeSnippet(CodeMemberMethod cmm,string strCode)248
{249
try250
{251
CodeSnippetStatement codebody = null;252
codebody = new CodeSnippetStatement(strCode);253
cmm.Statements.Add(codebody);254
}255
catch(System.Exception e)256
{257
throw e;258
}259
}260
相关属性 321
}322
}323



浙公网安备 33010602011771号