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 />