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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值