CodeDOM...se non ci fosse bisognerebbe inventarlo

lo ammetto, è uno dei namespace che più mi intrippa in .net!
(si può dire "intrippa" in un blog??)
Sarà perchè mi sta risolvendo un po di rogne?
Comunque faccio un copia e incolla di uno snippet un po lunghino ma che in pratica ha tutto quello che serve per l'autogenerazione di classi.
Servirà anche a me come riferimento.

<problema>
Voglio creare la seguente classe da codice
Imports System.Diagnostics

Namespace Esempio
    Public Class Classe
       
        Protected username As String
       
        Protected Overridable ReadOnly Property Username As [String]
            Get
                Return Me._username
            End Get
        End Property
       
        Public Overridable Sub WriteLineUsername()
            Debug.WriteLine(Me.Username)
        End Sub
    End Class
End Namespace
<problema />

<snippet>
ecco il codice che serve:

Public Shared Function CreaClasse() As String

'Creazione namespace
Dim ns As New CodeNamespace("Esempio")
ns.Imports.Add(New CodeNamespaceImport("System.Diagnostics"))

Dim classe As New CodeTypeDeclaration("Classe")
ns.Types.Add(classe)

'Creo un costruttore, con un parametro di tipo stringa
Dim aClassConstructor As New CodeConstructor
aClassConstructor.Attributes = MemberAttributes.Public
aClassConstructor.Parameters.Add(
New CodeParameterDeclarationExpression(New CodeTypeReference("String"), "username"))aClassConstructor.Statements.Add(New CodeAssignStatement(New CodeFieldReferenceExpression(New CodeThisReferenceExpression, "_username"), New CodeArgumentReferenceExpression("username")))

'Creo un membro protetto per la classe
Dim usernameProtected As New CodeMemberField("System.String", "username")
usernameProtected.Attributes = MemberAttributes.Family
classe.Members.Add(usernameProtected)

'Creo una proprietà in sola lettura
Dim usernameProperty As New CodeMemberProperty
With usernameProperty
   .Attributes = MemberAttributes.Family
   .Name = "Username"
   .Type =
New CodeTypeReference("String")
   .HasGet =
True
  
.HasSet = False
  
.GetStatements.Add(New CodeMethodReturnStatement(New CodeFieldReferenceExpression(New CodeThisReferenceExpression, "_username")))
End With
classe.Members.Add(usernameProperty)

'Creo un metodo Sub (void in c#)
Dim metodo As New CodeMemberMethod
With metodo
   .Name = "WriteLineUsername"
   .Attributes = MemberAttributes.Public
   .Statements.Add(
New CodeMethodInvokeExpression(New CodeSnippetExpression("Debug"), "WriteLine", New CodePropertyReferenceExpression(New CodeThisReferenceExpression, "Username")))
End With
classe.Members.Add(metodo)

'Generazione del codice della classe
Dim vbProvider As New VBCodeProvider
Dim codeGen As Compiler.ICodeGenerator = vbProvider.CreateGenerator
Dim sb As New StringBuilder
Dim sw As StringWriter = New StringWriter(sb)
codeGen.GenerateCodeFromNamespace(ns, sw,
Nothing)
Return sb.ToString

End Function

<snippet />

<SolitoPS>
Inutile dire che basta cambiare una riga (ripeto una) di codice per ottenere la controparte in c#.
Carino No?
<SolitoPS />

<PS_Folle>
Adesso mi faccio un generatore di codice che scrive il codice che dovrei scrivere al lavoro io
...ci sto un 10 volte di tempo in più ma fa più TREND! :-)
<PS_Folle />


Print | posted on giovedì 2 settembre 2004 17:39

Comments on this post

# re: CodeDOM...se non ci fosse bisognerebbe inventarlo

Requesting Gravatar...
Ora mi ricordo... si c'era uno che non si capiva se era siciliano o di bergamo alta... ;-)

Lo studio stasera... e domani all'alba... Poi domani mattina non romperò sul blog per qualche ora!

Ciao!
Left by Lorenzo Barbieri on set 02, 2004 4:11
Comments have been closed on this topic.