Come ben dice
Andrea, una delle cose più noiose e ripetitive del C# (e forse anche di
VB.NET, ma non so di per certo perchè non ho mai provato) è scrivere i banali
accessors per i Transfer Objects e similari.
#develop ha un'ottimo class wizard, che genera anche tutti i metodi
accessors, ma purtroppo non ha il debugger, non permette di sviluppare per
web.
Ecco quindi un'altra Macro per VS.NET: crea una proprietà pubblica (con
getter e setter) per ogni "field" privato definito nella classe.
Imports EnvDTE
Imports System.Diagnostics
Imports System.Windows
Imports System.Windows.Forms
Imports System
Imports System.Drawing
Public Module WriteGetterAndSetter
Sub WriteGetterAndSetter()
Dim projitem As ProjectItem = DTE.ActiveDocument.ProjectItem
Dim filecm As FileCodeModel = projitem.FileCodeModel
Dim celt As CodeElement = filecm.CodeElements.Item(1)
Dim celttype As CodeType
If (TypeOf celt Is CodeNamespace) Then
celt = celt.members.item(1)
End If
If (TypeOf celt Is CodeType) Then
celttype = CType(celt, CodeType)
Else
Throw New Exception("Didn't find a type definition as first thing in file or find a namespace as the first thing with a type inside the namespace.")
End If
Dim ep As EditPoint = celttype.GetStartPoint(vsCMPart.vsCMPartHeader).CreateEditPoint()
Try
DTE.UndoContext.Open("Insert public Properties")
Dim objTextDoc As Window
Dim objMovePt As TextSelection
objTextDoc = DTE.ActiveDocument.ActiveWindow
objMovePt = objTextDoc.Selection
ep.MoveToPoint(objMovePt.TopPoint)
'ep.LineUp()
'' Do comment.
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & "#region ""Properties""" & Microsoft.VisualBasic.Constants.vbCrLf)
'' Iterate over code elements emitting doc comments for functions.
For Each celt In celttype.Members
If (celt.Kind = vsCMElement.vsCMElementVariable) Then
Dim codefun As CodeVariable = celt
If (codefun.Access = vsCMAccess.vsCMAccessPrivate) Then
ep.Insert(Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & "public " & codefun.Type.AsString & " " & codefun.Name.Substring(1, codefun.Name.Length - 1))
ep.Insert(Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & "{")
ep.Insert(Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & "get" & Microsoft.VisualBasic.Constants.vbCrLf & Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & "{" & Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & "return " & codefun.Name & ";" & Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & "}" & Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & "set" & Microsoft.VisualBasic.Constants.vbCrLf & Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & "{" & Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & codefun.Name & " = value;" & Microsoft.VisualBasic.Constants.vbCrLf)
ep.Insert(Microsoft.VisualBasic.Constants.vbTab & Microsoft.VisualBasic.Constants.vbTab & "}")
ep.Insert(Microsoft.VisualBasic.Constants.vbCrLf & Microsoft.VisualBasic.Constants.vbTab & "}" & Microsoft.VisualBasic.Constants.vbCrLf)
End If
End If
Next
ep.Insert(Microsoft.VisualBasic.Constants.vbCrLf & Microsoft.VisualBasic.Constants.vbCrLf & Microsoft.VisualBasic.Constants.vbTab & "#endregion")
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
DTE.UndoContext.Close()
End Try
End Sub
End Module
Non è come avere il class builder, ma sempre meglio che niente
powered by IMHO
posted @ martedì 21 dicembre 2004 00:39