ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用CodeDom开发基于B/S的.NET+MSSQL代码生成器的随感(转)

使用CodeDom开发基于B/S的.NET+MSSQL代码生成器的随感(转)

原创 Linux操作系统 作者:jcszjswkzhou 时间:2019-05-30 20:48:04 0 删除 编辑
众所周知,.NET是面向对象的语言,因此一段代码里面就会有类、对象、接口、结构等与面向对象的思想密切相关的要素,而类中会有属性、方法,委托、事件等等,再往下属性又有私有变量或公有变量,这样一层层就象一颗树一样,而这每一个要素都与CodeDom命名空间下的类有着一一对应的关系,当你想用CodeDom生成一个类时,必须先生成类中的要素,如属性、方法,委托、事件等等,生成属性时,也必须先生成属性里的要素,这样一来,每生成一个要素,只要找到CodeDom里对应的类就行了,呵,是不是有点糊涂了。
众所周知,.NET是面向对象的语言,因此一段代码里面就会有类、对象、接口、结构等与面向对象的思想密切相关的要素,而类中会有属性、方法,委托、事件等等,再往下属性又有私有变量或公有变量,这样一层层就象一颗树一样,而这每一个要素都与CodeDom命名空间下的类有着一一对应的关系,当你想用CodeDom生成一个类时,必须先生成类中的要素,如属性、方法,委托、事件等等,生成属性时,也必须先生成属性里的要素,这样一来,每生成一个要素,只要找到CodeDom里对应的类就行了,呵,是不是有点糊涂了。
不要紧,现在我给大家一个例子看看,可能就要明白些了。
//保存源代码的流。
Stream codeStream = File.Open("Test.cs",FileMode.Create);
StreamWriter codeWriter = new StreamWriter(codeStream);

//创建一个代码生成器实例
CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeGenerator codeGenerator = provider.CreateGenerator(codeWriter);
CodeGeneratorOptions codeGeneratorOptions = new CodeGeneratorOptions();

//添加命名空间
CodeSnippetCompileUnit literal = new CodeSnippetCompileUnit
("using System; using System.Data; using System.Data.SqlClient; ");
codeGenerator.GenerateCodeFromCompileUnit(literal,codeWriter,codeGeneratorOptions);

//命名空间以及在此命名空间下面创建一个类
CodeNamespace codeNamespace = new CodeNamespace("Codedom");
CodeTypeDeclaration codeTypeDeclaration = new CodeTypeDeclaration();
codeTypeDeclaration.Name = "TestClass";
codeTypeDeclaration.IsClass = true;
codeTypeDeclaration.TypeAttributes = TypeAttributes.Public;
codeNamespace.Types.Add(codeTypeDeclaration);

//创建一个默认的构造函数
CodeConstructor codeConstructor = new CodeConstructor();
codeConstructor.Attributes = MemberAttributes.Public;
codeTypeDeclaration.Members.Add(codeConstructor);

//创建一个私有的字段
CodeMemberField codeMember = new CodeMemberField();
codeMember.Name = "sTest";
codeMember.Attributes = MemberAttributes.Private;
codeMember.Type = new CodeTypeReference(typeof(string));
codeTypeDeclaration.Members.Add(codeMember);

//添加一个可以操作和读取的属性
CodeMemberProperty codeMemberProperty = new CodeMemberProperty();
codeMemberProperty.Name = "Test";
codeMemberProperty.Attributes = MemberAttributes.Public;
codeMemberProperty.Type = new CodeTypeReference(typeof(string));
codeMemberProperty.GetStatements.Add
(
new CodeMethodReturnStatement
(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),"sTest")
)
);
codeMemberProperty.SetStatements.Add
(
new CodeAssignStatement
(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),"sTest"),new CodePropertySetValueReferenceExpression()
)
);
codeTypeDeclaration.Members.Add(codeMemberProperty);
//生成代码
codeGenerator.GenerateCodeFromNamespace(codeNamespace,codeWriter,codeGeneratorOptions);

codeWriter.Close();
codeStream.Close();
运行结果如下:
using System;
using System.Data;
using System.Data.SqlClient;

namespace Codedom{


public class TestClass {

private string sTest;

public TestClass() {
}

public virtual string Test {
get {
return this.sTest;
}
set {
this.sTest = value;
}
}
}
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-122573/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-08-29

  • 博文量
    3488
  • 访问量
    2620973