您的位置:首页 > 其它

微软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描述:
Final
在派生类中不能重写的成员。
Static
静态成员。在 Visual Basic 中,这等效于 Shared 关键字。
Override
重写基类成员的成员。
Const
常数成员。
New
新成员。
Overloaded
重载成员。某些语言(如 Visual Basic)要求显式指示重载成员。
Assembly
在同一程序集中任何类都可以访问的成员。
FamilyAndAssembly
可以在其类以及其在同一程序集中的派生类中访问的成员。
Family
可以在其类以及其派生类家族内访问的成员。
FamilyOrAssembly
可以在其类、其在任何程序集中的派生类以及在同一程序集的任何类中均访问的成员。
Private
私有成员。
Public
公共成员。
AccessMask
访问屏蔽。
ScopeMask
范围屏蔽。
VTableMask
VTable 屏蔽。
注意:
没有 Virtual 成员属性。在不将成员指定为 Final 的情况下,通过将成员访问设置为 Public (property1.Attributes = MemberAttributes.Public) 来将成员声明为 virtual。缺少 Final 标志会使成员在 C# 中为 virtual (public virtual),在 Visual Basic 中为 overrideable (Public Overrideable)。若要避免将成员声明为 virtualoverrideable,请设置 Attributes 属性中的 PublicFinal 标志。有关设置成员属性 (Attribute) 的更多信息,请参见 Attributes 属性 (Property)。
注意:
用于设置访问标志(包含术语 PublicPrivateAssemblyFamily 的标志)的模式为:使用 AccessMask 掩码掩盖所有访问标志,然后设置需要的访问标志。例如,将构造函数(名为 constructor1)标识为 public 的代码语句是 constructor1.Attributes = (constructor1.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;。将 Attributes 属性直接设置为访问标志(例如 constructor1.Attributes = MemberAttributes.Public;)会清除可能已设置的所有其他标志。使用 ScopeMask 掩码设置范围标志(AbstractFinalStaticOverrideConst)时,也应使用此模式。
设置方法属性为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>

{
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: