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 @ martedì 21 dicembre 2004 00:39

Print

Comments on this entry:

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

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

:)

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

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

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

Left by TheDuzBlog! ;-p at 03/01/2005 16:11
Gravatar
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011