c#变量生成属性Word格式.docx
《c#变量生成属性Word格式.docx》由会员分享,可在线阅读,更多相关《c#变量生成属性Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
![c#变量生成属性Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/15/42d55d86-5702-4a8e-867e-44896d72ffb0/42d55d86-5702-4a8e-867e-44896d72ffb01.gif)
ImportsSystem
ImportsEnvDTE
ImportsEnvDTE80
ImportsSystem.Diagnostics
PublicModuleEditorHelper
'
为一个参数封装一般属性访问器
PublicSubEncapsulateField()
DimprojectItemAsProjectItem=DTE.ActiveDocument.ProjectItem
DimfileCodeModelAsFileCodeModel=projectItem.FileCodeModel
得到当前选定的内容
DimselectTextAsTextSelection=DTE.ActiveDocument.Selection
获取到当前光标的位置
DimpointAsTextPoint=selectText.ActivePoint
Try
DimcodeElementAsCodeElement=fileCodeModel.CodeElementFromPoint(point,vsCMElement.vsCMElementVariable)
If(codeElementIsNothing)Then
Return
EndIf
Debug.Assert(codeElement.Kind=vsCMElement.vsCMElementVariable)
DimcodeVarAsCodeVariable=CType(codeElement,CodeVariable)
DimfieldNameAsString=codeVar.Name
DimcodeClassAsCodeClass=CType(codeVar.Parent,CodeClass)
AddPropertyToClass(codeClass,fieldName,codeVar.Type)
CatchexAsException
吃掉异常,不做处理或者提示
EndTry
EndSub
PublicSubEncapsulateAllFields()
DimcodeElementAsCodeElement=fileCodeModel.CodeElementFromPoint(point,vsCMElement.vsCMElementClass)
DimcodeClassAsCodeClass=CType(codeElement,CodeClass)
DimiAsInteger
Fori=1TocodeClass.Members.Count
如果属性已经定义,会抛出异常
在这里处理异常,即使新增的属性已经定义,也可以继续处理下面的代码
DimelementAsCodeElement=codeClass.Members.Item(i)
If(element.Kind=vsCMElement.vsCMElementVariable)Then
DimcodeVariableAsCodeVariable=CType(element,CodeVariable)
If(NotcodeVariable.IsShared)Then'
静态变量不需要增加属性
AddPropertyToClass(codeClass,codeVariable.Name,codeVariable.Type)
吃掉异常
Next
可能并没有选择有效的类定义,这时会抛出异常,忽略
根据成员的名称的类型,在类对象中插入属性
PrivateSubAddPropertyToClass(ByValcodeClassAsCodeClass,ByValfieldNameAsString,ByValfieldTypeAsObject)
生成属性的名称,规则是首先字母大写。
如果变量的开头为“_”,移除
DimpropertyNameAsString=fieldName
If(propertyName.StartsWith("
_"
))Then
propertyName=propertyName.TrimStart("
c)
propertyName=propertyName.Substring(0,1).ToUpper()&
propertyName.Substring
(1)
创建属性对象
-1表示代码插入到类的最下方
vsCMAccess.vsCMAccessPublic表示为public
DimcodePropertyAsCodeProperty=codeClass.AddProperty(propertyName,propertyName,fieldType,-1,vsCMAccess.vsCMAccessPublic)
Getter
DimgetterAsCodeFunction=codeProperty.Getter
DimgetterPointAsTextPoint=getter.GetStartPoint(vsCMPart.vsCMPartBody)
DimgetterEditPointAsEditPoint=getterPoint.CreateEditPoint()
getterEditPoint.Delete(getter.GetEndPoint(vsCMPart.vsCMPartBody))
getterEditPoint.Insert(vbCrLf)'
插入回车符
getterEditPoint.LineUp()
getterEditPoint.Indent(,4)'
缩进4个位置
getterEditPoint.Insert("
return"
&
fieldName&
;
"
)
Setter
DimsetterAsCodeFunction=codeProperty.Setter
DimsetterPointAsTextPoint=setter.GetStartPoint(vsCMPart.vsCMPartBody)
DimsetterEditPointAsEditPoint=setterPoint.CreateEditPoint()
setterEditPoint.Insert(vbCrLf)'
setterEditPoint.LineUp()
setterEditPoint.Indent(,4)'
setterEditPoint.Insert(fieldName&
=value;
EndModule
我定义了两个Public方法:
EncapsulateField和EncapsulateAllFields,分别用于为类的一个变量封装属性,或者为类中所有的变量(非静态)封装属性。
使用上面的宏的方法很简单,选择“工具”>
“宏”>
“宏资源管理器”就可以看到我们已经创建的宏方法,如下图所示:
假如你已经编写了这样一段代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceDemo
{
publicclassPerson
{
privateint_id;
privatestring_name;
privateDateTime_birthDay;
}
}
将光标移到“_name”变量上,然后双击“EncapsulateField”宏,就运行了该宏。
运行后,你可以得到这样的代码:
publicstringName
get
return_name;
set
_name=value;
可以看到“EncapsulateField”宏已经为privatestring_name;
创建了相应的属性。
EncapsulateAllFields宏只需要将光标放在Person类的代码区域中,就可以正常执行。
例如针对上面的代码,EncapsulateAllFields后可以为Person类中的每一个变量都生成相应的属性。
(注:
上面的代码中Name属性已经有定义,所有试图再添加Name属性时会抛出异常,在EncapsulateAllFields宏定义中,已经将该异常吃掉,所以,可以正确地为所有变量生成属性)。
运行后的代码如下:
privateDateTime_birth