微软CodeDom模型学习笔记(三)
2009-12-27 23:17
274 查看
3, GenerateCodeFromMember方法 | ||||||||||||||||||||||||||||||
MSDN描述:为指定的代码文档对象模型 (CodeDOM) 成员声明生成代码,并使用指定的选项将代码发送到指定的文本编写器。 通俗理解:将类的各种类型成员输出为代码字符串 | ||||||||||||||||||||||||||||||
a, CodeMemberField表示某种类型的字段的声明。 | ||||||||||||||||||||||||||||||
CodeMemberField ret = new CodeMemberField(); ret.Type = new CodeTypeReference(typeof(Int32)); ret.Attributes = MemberAttributes.Private; ret.Name = "m_Number"; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为:private int m_Number; | ||||||||||||||||||||||||||||||
为字段上加注释 | ||||||||||||||||||||||||||||||
CodeMemberField ret = new CodeMemberField(); ret.Type = new CodeTypeReference(typeof(Int32)); ret.Attributes = MemberAttributes.Private; ret.Name = "m_Number"; ret.Comments.Add(new CodeCommentStatement("这是一个测试用的字段", true)); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个测试用的字段 private int m_Number; | ||||||||||||||||||||||||||||||
为字段加上属性描述 | ||||||||||||||||||||||||||||||
CodeMemberField ret = new CodeMemberField(); ret.Type = new CodeTypeReference(typeof(Int32)); ret.Attributes = MemberAttributes.Private; ret.Name = "m_Number"; ret.Comments.Add(new CodeCommentStatement("这是一个测试用的字段", true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个测试用的字段 [System.SerializableAttribute(true)] private int m_Number; | ||||||||||||||||||||||||||||||
为字段加上初始化 | ||||||||||||||||||||||||||||||
CodeMemberField ret = new CodeMemberField(); ret.Type = new CodeTypeReference(typeof(Int32)); ret.Attributes = MemberAttributes.Private; ret.Name = "m_Number"; ret.Comments.Add(new CodeCommentStatement("这是一个测试用的字段", true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); ret.InitExpression = new CodePrimitiveExpression(100); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个测试用的字段 [System.SerializableAttribute(true)] private int m_Number = 100; | ||||||||||||||||||||||||||||||
b, CodeMemberEvent表示一个类型的事件的声明。 | ||||||||||||||||||||||||||||||
CodeMemberEvent ret = new CodeMemberEvent(); ret.Attributes = MemberAttributes.Public; ret.Name = "Click"; ret.Type =new CodeTypeReference (typeof (EventHandler<EventArgs>)); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public event System.EventHandler<System.EventArgs> Click; | ||||||||||||||||||||||||||||||
为事件加上注释 | ||||||||||||||||||||||||||||||
CodeMemberEvent ret = new CodeMemberEvent(); ret.Attributes = MemberAttributes.Public; ret.Name = "Click"; ret.Type =new CodeTypeReference (typeof (EventHandler<EventArgs>)); ret.Comments.Add(new CodeCommentStatement("这是一个Click事件",true)); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个Click事件 public event System.EventHandler<System.EventArgs> Click; | ||||||||||||||||||||||||||||||
为事件加上属性 | ||||||||||||||||||||||||||||||
CodeMemberEvent ret = new CodeMemberEvent(); ret.Attributes = MemberAttributes.Public; ret.Name = "Click"; ret.Type =new CodeTypeReference (typeof (EventHandler<EventArgs>)); ret.Comments.Add(new CodeCommentStatement("这是一个Click事件",true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个Click事件 [System.SerializableAttribute(true)] public event System.EventHandler<System.EventArgs> Click; | ||||||||||||||||||||||||||||||
备注:以下两个成员我还没有搞清楚起什么作用,msdn上说的也不清楚,有人清楚的话请告诉我,谢谢 QQ:32354456 Email:diablohe@hotmail.com ret.PrivateImplementationType = new CodeTypeReference(typeof(double)); ret.ImplementationTypes.Add(new CodeTypeReference(typeof(int))); | ||||||||||||||||||||||||||||||
c, CodeMemberMethod表示某种类型的方法的声明。 | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public virtual int DoSomething() { } | ||||||||||||||||||||||||||||||
注意到MemberAttributes.Public直接对应了public virtual,有些奇怪 这里有必要先穿插研究下MemberAttributes的各种标志的用法 | ||||||||||||||||||||||||||||||
c.1MemberAttributes定义类成员的成员属性标识符。 Msdn描述:
没有 Virtual 成员属性。在不将成员指定为 Final 的情况下,通过将成员访问设置为 Public (property1.Attributes = MemberAttributes.Public) 来将成员声明为 virtual。缺少 Final 标志会使成员在 C# 中为 virtual (public virtual),在 Visual Basic 中为 overrideable (Public Overrideable)。若要避免将成员声明为 virtual 或 overrideable,请设置 Attributes 属性中的 Public 和 Final 标志。有关设置成员属性 (Attribute) 的更多信息,请参见 Attributes 属性 (Property)。 注意: 用于设置访问标志(包含术语 Public、Private、Assembly 或 Family 的标志)的模式为:使用 AccessMask 掩码掩盖所有访问标志,然后设置需要的访问标志。例如,将构造函数(名为 constructor1)标识为 public 的代码语句是 constructor1.Attributes = (constructor1.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;。将 Attributes 属性直接设置为访问标志(例如 constructor1.Attributes = MemberAttributes.Public;)会清除可能已设置的所有其他标志。使用 ScopeMask 掩码设置范围标志(Abstract、Final、Static、Override 或 Const)时,也应使用此模式。 | ||||||||||||||||||||||||||||||
设置方法属性为public而不是public virtual | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public int DoSomething() { } | ||||||||||||||||||||||||||||||
为方法加上注释 | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public| MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.Comments.Add(new CodeCommentStatement("这是一个方法!,true)); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个方法 public int DoSomething() { } | ||||||||||||||||||||||||||||||
为方法加上注释 | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.Comments.Add(new CodeCommentStatement("这是一个方法!",true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个方法! [System.SerializableAttribute(true)] public int DoSomething() { } | ||||||||||||||||||||||||||||||
为方法加上2个参数 | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.Comments.Add(new CodeCommentStatement("这是一个方法!",true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); CodeParameterDeclarationExpression arg1 = new CodeParameterDeclarationExpression(); arg1 .Type =new CodeTypeReference (typeof(Boolean)); arg1.Name ="arg1"; ret.Parameters.Add(arg1); CodeParameterDeclarationExpression arg2 = new CodeParameterDeclarationExpression(); arg2.Type = new CodeTypeReference(typeof(int)); arg2.Name = "arg2"; arg2.Direction = FieldDirection.Out; ret.Parameters.Add(arg2); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个方法! [System.SerializableAttribute(true)] int System.Double.DoSomething(bool arg1, out int arg2) { } | ||||||||||||||||||||||||||||||
为方法里加上执行代码 | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.Comments.Add(new CodeCommentStatement("这是一个方法!",true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); CodeParameterDeclarationExpression arg1 = new CodeParameterDeclarationExpression(); arg1 .Type =new CodeTypeReference (typeof(Boolean)); arg1.Name ="arg1"; ret.Parameters.Add(arg1); CodeParameterDeclarationExpression arg2 = new CodeParameterDeclarationExpression(); arg2.Type = new CodeTypeReference(typeof(int)); arg2.Name = "arg2"; arg2.Direction = FieldDirection.Out; ret.Parameters.Add(arg2); ret.Statements.Add( new CodeSnippetStatement("if(arg1)arg2=200;/nelse arg2=0;/nreturn arg2;")); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个方法! [System.SerializableAttribute(true)] int System.Double.DoSomething(bool arg1, out int arg2) { if(arg1)arg2=200; else arg2=0; return arg2; } | ||||||||||||||||||||||||||||||
如果改方法是泛型方法,可以指定泛型参数 | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.Comments.Add(new CodeCommentStatement("这是一个方法!",true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); CodeParameterDeclarationExpression arg1 = new CodeParameterDeclarationExpression(); arg1 .Type =new CodeTypeReference (typeof(Boolean)); arg1.Name ="arg1"; ret.Parameters.Add(arg1); CodeParameterDeclarationExpression arg2 = new CodeParameterDeclarationExpression(); arg2.Type = new CodeTypeReference(typeof(int)); arg2.Name = "arg2"; arg2.Direction = FieldDirection.Out; ret.Parameters.Add(arg2); ret.Statements.Add( new CodeSnippetStatement("if(arg1)arg2=200;/nelse arg2=0;/nreturn arg2;")); CodeTypeParameter type1 = new CodeTypeParameter("TypeOne"); ret.TypeParameters.Add(type1); CodeTypeParameter type2 = new CodeTypeParameter("TypeTwo"); ret.TypeParameters.Add(type2); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个方法! [System.SerializableAttribute(true)] int System.Double.DoSomething<TypeOne, TypeTwo>(bool arg1, out int arg2) { if(arg1)arg2=200; else arg2=0; return arg2; } | ||||||||||||||||||||||||||||||
为泛型参数指定约束条件 | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.Comments.Add(new CodeCommentStatement("这是一个方法!",true)); CodeExpression constBool = new CodePrimitiveExpression(true); CodeAttributeArgument attrArg = new CodeAttributeArgument(constBool); CodeTypeReference attrType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attribute = new CodeAttributeDeclaration(attrType, attrArg); ret.CustomAttributes.Add(attribute); CodeParameterDeclarationExpression arg1 = new CodeParameterDeclarationExpression(); arg1 .Type =new CodeTypeReference (typeof(Boolean)); arg1.Name ="arg1"; ret.Parameters.Add(arg1); CodeParameterDeclarationExpression arg2 = new CodeParameterDeclarationExpression(); arg2.Type = new CodeTypeReference(typeof(int)); arg2.Name = "arg2"; arg2.Direction = FieldDirection.Out; ret.Parameters.Add(arg2); ret.Statements.Add( new CodeSnippetStatement("if(arg1)arg2=200;/nelse arg2=0;/nreturn arg2;")); CodeTypeParameter type1 = new CodeTypeParameter("TypeOne"); type1.Constraints.Add(typeof (IList<int>)); ret.TypeParameters.Add(type1); CodeTypeParameter type2 = new CodeTypeParameter("TypeTwo"); type2.Constraints.Add(typeof(ValueType)); ret.TypeParameters.Add(type2); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: /// 这是一个方法! [System.SerializableAttribute(true)] int System.Double.DoSomething<TypeOne, TypeTwo>(bool arg1, out int arg2) where TypeOne : System.Collections.Generic.IList<int> where TypeTwo : System.ValueType { if(arg1)arg2=200; else arg2=0; return arg2; } | ||||||||||||||||||||||||||||||
还有3个事件,为了轻装上阵,把代码回到最简单的第一步的基础上来测试 | ||||||||||||||||||||||||||||||
事件1:PopulateParameters在首次访问 Parameters 集合时将激发的事件。 | ||||||||||||||||||||||||||||||
定义一个事件处理程序 static void ret_PopulateParameters(object sender, EventArgs e) { CodeMemberMethod method = sender as CodeMemberMethod; CodeParameterDeclarationExpression arg1 = new CodeParameterDeclarationExpression(); arg1.Type = new CodeTypeReference(typeof(Boolean)); arg1.Name = "arg1"; method.Parameters.Add(arg1); CodeParameterDeclarationExpression arg2 = new CodeParameterDeclarationExpression(); arg2.Type = new CodeTypeReference(typeof(int)); arg2.Name = "arg2"; arg2.Direction = FieldDirection.Out; method.Parameters.Add(arg2); } | ||||||||||||||||||||||||||||||
ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.PopulateParameters += new EventHandler(ret_PopulateParameters); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public int DoSomething(bool arg1, out int arg2) { } | ||||||||||||||||||||||||||||||
事件2:PopulateStatements在首次访问 Statements 集合时将激发的事件。 | ||||||||||||||||||||||||||||||
再定义一个事件处理程序 static void ret_PopulateStatements(object sender, EventArgs e) { CodeMemberMethod method = sender as CodeMemberMethod; method.Statements.Add( new CodeSnippetStatement("if(arg1)arg2=200;/nelse arg2=0;/nreturn arg2;")); } | ||||||||||||||||||||||||||||||
CodeMemberMethod ret = new CodeMemberMethod(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.PopulateParameters += new EventHandler(ret_PopulateParameters); ret.PopulateStatements += new EventHandler(ret_PopulateStatements); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public int DoSomething(bool arg1, out int arg2) { if(arg1)arg2=200; else arg2=0; return arg2; } | ||||||||||||||||||||||||||||||
事件3:PopulateImplementationTypes在首次访问 ImplementationTypes 集合时将激发的事件。 | ||||||||||||||||||||||||||||||
还每搞清楚起什么作用,知道的人告诉我下,谢谢 QQ:32354456 Email:diablohe@hotmail.com | ||||||||||||||||||||||||||||||
ReturnTypeCustomAttributes获取该方法的返回类型的自定义属性。 | ||||||||||||||||||||||||||||||
ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "DoSomething"; ret.ReturnType =new CodeTypeReference (typeof (int)); ret.ReturnTypeCustomAttributes.Add( new CodeAttributeDeclaration( new CodeTypeReference(typeof(SerializableAttribute)))); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: [return: System.SerializableAttribute()] public int DoSomething() { } 备注:本人还没见过这种语法,也不清楚起什么用,知道的人告诉我下,谢谢 QQ:32354456 Email:diablohe@hotmail.com | ||||||||||||||||||||||||||||||
PrivateImplementationType,ImplementationTypes这两个属性我也不清楚,知道的告诉我下,谢谢 | ||||||||||||||||||||||||||||||
d, CodeMemberProperty表示某种类型的属性的声明。 Type 属性指定属性的数据类型。GetStatements 属性包含属性的任何 get 语句方法。SetStatements 属性包含属性的任何 set 语句方法。Parameters 属性指定属性的任何参数,如索引器属性所需的参数。 | ||||||||||||||||||||||||||||||
CodeMemberProperty ret = new CodeMemberProperty(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "MyProperty"; ret.HasGet = true; ret.HasSet = true; return ret; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public void MyProperty { get { } set { } } | ||||||||||||||||||||||||||||||
为getter和setter指定代码 | ||||||||||||||||||||||||||||||
CodeMemberProperty ret = new CodeMemberProperty(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "MyProperty"; ret.HasGet = true; ret.HasSet = true; ret.GetStatements.Add(new CodeSnippetStatement("return m_MyProperty;")); ret.SetStatements.Add(new CodeSnippetStatement("m_MyProperty=value;")); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public void MyProperty public void MyProperty { get { return m_MyProperty; } set { m_MyProperty=value; } } | ||||||||||||||||||||||||||||||
为属性增加参数 Msdn:通常情况下,属性不具有参数。CodeDom 支持这方面的一个特例。对于具有特殊名称“Item”以及一个或多个参数的任何属性,它都为该类声明索引器属性。但是,并非所有语言都支持索引器声明。 | ||||||||||||||||||||||||||||||
CodeMemberProperty ret = new CodeMemberProperty(); ret.Attributes = MemberAttributes.Public | MemberAttributes.Final; ret.Name = "Item"; ret.HasGet = true; ret.HasSet = true; CodeParameterDeclarationExpression par=new CodeParameterDeclarationExpression (); par.Type =new CodeTypeReference (typeof(int)); par.Name ="index"; ret.Parameters.Add(par); ret.GetStatements.Add(new CodeSnippetStatement("return m_MyProperty;")); ret.SetStatements.Add(new CodeSnippetStatement("m_MyProperty=value;")); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public void this[int index] { get { return m_MyProperty; } set { m_MyProperty=value; } } | ||||||||||||||||||||||||||||||
注意:只有属性名为Item的时候参数才起作用,否则不起任何作用 | ||||||||||||||||||||||||||||||
e, CodeConstructor表示一个类型的实例构造函数的声明。 | ||||||||||||||||||||||||||||||
CodeConstructorret = new CodeConstructor (); ret.Name = "dd"; | ||||||||||||||||||||||||||||||
codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: private () { } 没有函数名,怎么会事?哦,构造函数的名必须是与类名一致,不能自行定义的,那么就加入到类里试验下吧,找了下,就是CodeTypeDeclaration | ||||||||||||||||||||||||||||||
加入类信息 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration("MyType"); CodeConstructor constructor = new CodeConstructor(); constructor.Name = "dd"; ret.Members.Add(constructor); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyType { private MyType() { } } 注意构造函数,达到了预期效果,哈哈 | ||||||||||||||||||||||||||||||
注意,构造函数和普通函数的唯一区别就是Name属性会被忽略,不起任何作用,所以其他属性也就不再逐一研究了 | ||||||||||||||||||||||||||||||
f, CodeTypeConstructor表示类的静态构造函数。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration("MyType"); CodeTypeConstructor constructor = new CodeTypeConstructor(); constructor.Name = "dd"; ret.Members.Add(constructor); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyType { static MyType() { } } | ||||||||||||||||||||||||||||||
其他属性类似普通函数,不再研究了 | ||||||||||||||||||||||||||||||
g, CodeTypeDeclaration表示类、结构、接口或枚举的类型声明。 本节最复杂的类型了,需要多花点精力,还是从最简单的开始 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { } 下面按字典顺序一个一个地研究各个属性 | ||||||||||||||||||||||||||||||
g-1, Attributes | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.Attributes = MemberAttributes.Private; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { } 还是public,并不是预期的效果,接连测试其他几个都是public Msdn是这样描述的:此属性用于指定类型成员的属性。并没有说能指定类的属性,看来这个属性对类无效。 | ||||||||||||||||||||||||||||||
g-2 BaseTypes获取类型的基类型。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.BaseTypes.Add(new CodeTypeReference(typeof(Stream))); ret.BaseTypes.Add(new CodeTypeReference(typeof(IComparable))); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass : System.IO.Stream, System.IComparable { } | ||||||||||||||||||||||||||||||
g-3 Comments代表注释 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.Comments.Add(new CodeCommentStatement("这是一个类的声明!")); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: // 这是一个类的声明! public class MyClass { } | ||||||||||||||||||||||||||||||
g-4 CustomAttributes自定义属性 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; CodeTypeReference attType = new CodeTypeReference(typeof(SerializableAttribute)); CodeAttributeDeclaration attr = new CodeAttributeDeclaration(attType); ret.CustomAttributes.Add(attr); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: [System.SerializableAttribute()] public class MyClass { } | ||||||||||||||||||||||||||||||
g-5 IsClass获取或设置一个值,该值指示该类型是否是类或引用类型。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.IsClass = true; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { } | ||||||||||||||||||||||||||||||
g-5 IsEnum获取或设置一个值,该值指示该类型是否是枚举。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.IsEnum = true ; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public enum MyClass { } | ||||||||||||||||||||||||||||||
g-6 IsInterface获取或设置一个值,该值指示该类型是否是接口。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.IsInterface = true ; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public interface MyClass { } | ||||||||||||||||||||||||||||||
g-7 IsPartial获取或设置一个值,该值指示该类型声明是完整的类型声明还是分部类型声明。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.IsPartial = true ; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public partial class MyClass { } | ||||||||||||||||||||||||||||||
g-8 IsStruct获取或设置一个值,该值指示该类型是不是值类型(结构)。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.IsStruct = true ; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public struct MyClass { } | ||||||||||||||||||||||||||||||
g-9 LinePragma此属性指示类型成员声明的位置。此属性可用于报告错误和进行调试。当基于模板文件生成代码时,类型成员声明的位置很有用。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.LinePragma = new CodeLinePragma(); ret.LinePragma.LineNumber = 5; ret.LinePragma.FileName = "aaa.txt"; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: #line 5 "aaa.txt" public class MyClass { } #line default #line hidden 未能搞明白用途,以后做代码生成器的时候再研究吧,有人知道用途的告诉我下,谢谢 QQ:32354456 Email:diablohe@hotmail.com | ||||||||||||||||||||||||||||||
g-10 Members获取所表示的类型的类成员的集合。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; CodeMemberField field = new CodeMemberField(); field.Name = "MyField"; field.Type = new CodeTypeReference(typeof(int)); ret.Members.Add(field); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { private int MyField; } | ||||||||||||||||||||||||||||||
加入一个方法 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; CodeMemberMethod method= new CodeMemberMethod(); method.Name = " MyMethod"; method.ReturnType = new CodeTypeReference(typeof(int)); ret.Members.Add(method); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { private int MyMethod() { } } | ||||||||||||||||||||||||||||||
加入一个属性 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; CodeMemberProperty property = new CodeMemberProperty(); property.Name = "MyProperty"; property.Type = new CodeTypeReference(typeof(int)); property.HasGet = true; ret.Members.Add(property); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { private int MyProperty { get { } } } | ||||||||||||||||||||||||||||||
加入一个事件 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; CodeMemberEvent myEvent = new CodeMemberEvent(); myEvent.Name = "MyEvent"; myEvent.Type = new CodeTypeReference(typeof(EventHandler<EventArgs>)); ret.Members.Add(myEvent); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { private event System.EventHandler<System.EventArgs> MyEvent; } | ||||||||||||||||||||||||||||||
加入一个构造函数 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; CodeConstructor cst = new CodeConstructor(); ret.Members.Add(cst); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { private MyClass() { } } | ||||||||||||||||||||||||||||||
加入类型构造函数 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; CodeTypeConstructor cst = new CodeTypeConstructor(); ret.Members.Add(cst); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass { static MyClass() { } } | ||||||||||||||||||||||||||||||
g-11 TypeAttributes获取或设置类型的属性。 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.TypeAttributes = System.Reflection.TypeAttributes.NestedAssembly; codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: internal class MyClass { } TypeAttributes包含的类型很丰富,以后慢慢捉摸吧 | ||||||||||||||||||||||||||||||
g-12 TypeParameters类型的模版参数,范型类定义用这个参数 | ||||||||||||||||||||||||||||||
CodeTypeDeclaration ret = new CodeTypeDeclaration(); ret.Name = "MyClass"; ret.TypeParameters.Add("T1"); ret.TypeParameters.Add("T2"); codeProvider.GenerateCodeFromMember(ret, tw, options); 输出的代码字符串为: public class MyClass<T1, T2> { } | ||||||||||||||||||||||||||||||
相关文章推荐
- 微软CodeDom模型学习笔记(一)
- 微软CodeDom模型学习笔记(全记录)
- 微软CodeDom模型学习笔记(二)
- 微软CodeDom模型学习笔记(全)
- 微软CodeDom模型学习笔记(四)
- 微软CodeDom模型学习笔记(五)
- 微软解决方案框架(MSF)学习笔记(二)~MSF团队模型
- 人工智障学习笔记——强化学习(2)基于模型的DP方法
- EntityFramework Core 学习笔记 —— 创建模型
- ExtJS4学习笔记九--数据模型的使用
- JVM 学习笔记 1. JVM 运行模型
- Factorization Machines 学习笔记(二)模型方程(转)
- TCP/IP网络编程 学习笔记_4 --OSI七层网络模型
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
- 微软企业库5.0学习笔记(二)关于5.0版本
- 微软企业库5.0学习笔记(七)存储容器的引用
- iOS学习笔记<20> iOS中的GCD多线程模型 & ios事件的通知方法
- 软件开发过程及几个常见的开发模型(软件工程学习笔记)
- linux学习笔记2--diver初始化及设备模型
- Directx11学习笔记【十六】 光照模型的实现