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
相关属性#region 相关属性
261
/**//// <summary>
262
/// 代码提供容器
263
/// </summary>
264
public CodeCompileUnit CodeRoot
265
{
266
get
267
{
268
return _CodeRoot;
269
}
270
set
271
{
272
_CodeRoot=value;
273
}
274
}
275
276
/**//// <summary>
277
/// 代码名字空间
278
/// </summary>
279
public CodeNamespace cn
280
{
281
get
282
{
283
return _cn;
284
}
285
set
286
{
287
_cn=value;
288
}
289
}
290
291
/**//// <summary>
292
/// 代码类型提供者
293
/// </summary>
294
public CodeDomProvider provider
295
{
296
get
297
{
298
return _provider;
299
}
300
set
301
{
302
_provider=value;
303
}
304
}
305
306
/**//// <summary>
307
/// 生成代码文件名
308
/// </summary>
309
public string strFileName
310
{
311
get
312
{
313
return _strFileName;
314
}
315
set
316
{
317
_strFileName=value;
318
}
319
}
320
#endregion
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

相关属性#region 相关属性261

/**//// <summary>262
/// 代码提供容器263
/// </summary>264
public CodeCompileUnit CodeRoot265

{266
get267

{268
return _CodeRoot;269
}270
set271

{272
_CodeRoot=value;273
}274
}275

276

/**//// <summary>277
/// 代码名字空间278
/// </summary>279
public CodeNamespace cn280

{281
get282

{283
return _cn;284
}285
set286

{287
_cn=value;288
}289
}290

291

/**//// <summary>292
/// 代码类型提供者293
/// </summary>294
public CodeDomProvider provider295

{296
get297

{298
return _provider;299
}300
set301

{302
_provider=value;303
}304
}305

306

/**//// <summary>307
/// 生成代码文件名308
/// </summary>309
public string strFileName310

{311
get312

{313
return _strFileName;314
}315
set316

{317
_strFileName=value;318
}319
}320
#endregion 321
}322
}323

