微软CodeDom模型学习笔记(三)

本文为微软CodeDom模型的学习笔记,重点探讨了构造函数(constructor)、类(class)、属性(attributes)、程序集(assembly)以及参数(parameters)的使用和实现细节。
摘要由CSDN通过智能技术生成

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

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值