Getter e Setters: che noia!!!

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 Smile

powered by IMHO

posted @ lunedì 20 dicembre 2004 22.39

Print

Comments on this entry:

# re: Getter e Setters: che noia!!!

Left by Stefano Grevi at 21/12/2004 10.22
Gravatar
Anche VS2005... nei tools di refactoring -> Encapsulate Field...

:)

# re: Getter e Setters: che noia!!!

Left by Simone at 21/12/2004 14.34
Gravatar
Si, ma non mi sento ancora molto confident nell'usare VS2005 per sviluppare roba che deve andare in produzione..

# re: Getter e Setters: che noia!!!

Left by Stefano Grevi at 21/12/2004 15.56
Gravatar
Perfettamente ragione, Simone.

Io per esempio sono uno di quei 'disgraziati' vbisti di vecchio conio che nel passaggio a VS2003 ha sentito la mancanza del class builder, anche se poi nel codice generato occorreva comunque rimetterci le mani.

A furia di pestare tasti a scrivere gli accessor ai campi ero quasi entrato in simbiosi con la tastiera :(

La macro che riporti è un notevole passo avanti per la 1.1, ma è la frase "crea una proprietà pubblica (con getter e setter) per ogni "field" privato definito nella classe." che mi fa piacere ed a un tempo tremare : se ho campi privati che tali devono restare ? Mani nel codice, ovviamente !

Come tool anche questa macro deve, ritengo, essere usata in maniera critica e non come pedissequo strumento di produzione 'cieco' di codice (anche se penso che tu te ne sia già reso conto). Che non sia un novello copyncolla.

Una idea brutalmente prelevata da VS2005 potrebbe essere quella di presentare una checklist prima della trasformazione in proprietà in modo da scegliere quali siano i campi degni dell'operazione. Che ne dici ?


# re: Banalissima macro per creare i blocchi property in VB.NET

Left by TheDuzBlog! ;-p at 03/01/2005 14.11
Gravatar
Comments have been closed on this topic.
«febbraio»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910