Introspection et macro

cuicui6669 Messages postés 8 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 1 février 2010 - 29 janv. 2010 à 15:48
cuicui6669 Messages postés 8 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 1 février 2010 - 1 févr. 2010 à 08:56
Bonjour,

Je sais pas trop par où commencer pour expliquer mon problème, donc j'espère que ce sera clair. Je suis en train de coder une macro sous VS2008. Son but est de générer une classe de DAO à partir d'un objet métier. En effet, les classes de DAO sont quasiment tout le temps les mêmes car elles contiennent les 4 "grandes" méthodes Create Retrieve Update Delete (CRUD). Vous me direz: "mais ya des framework qui font tout çà (NHibernate, etc...)". Or je travaille avec un chef de projet qui ne cherche pas à savoir qu'il existe déjà des trucs bien, bref je passe...
Pour illustrer mon problème, je vais utiliser un exemple.
Voici donc la classe métier Personne
Class Personne

private _nom as string
private _age as integer

public Property Nom as String
... 'pas besoin d'écrire: on sait ce qu'il y a dedans 
end Property

public Property Age as Integer
... 'pas besoin d'écrire: on sait ce qu'il y a dedans 
end Property

End Class


Donc jusque là ca va... maintenant je créé un fichier PersonneDAO.vb avec sa classe:
Public Class PersonneDAO
Personne 'ici le texte "Personne" est sélectionné pour ma macro
End Class


Donc le but est de générer le code de ma classe PersonneDAO à partir du texte sélectionné dedans. Ici le texte sélectionné est "Personne". En effet, ce mot "Personne" est en quelque sorte la "clé" pour charger la classe dans ma macro et ainsi "parcourir" ses propriétés grâce à l'introspection (System.Reflection).

Voici ma macro:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Class genererDAO


    Shared Sub genererDAO()
        ' Recuperation de l'extention du fichier
        Dim file As String = DTE.ActiveDocument.FullName
        Dim fileType As String = FileIO.FileSystem.GetFileInfo(file).Extension

        ' Recuperation du texte selectionné
        Dim textSelection As TextSelection = DTE.ActiveDocument.Selection()

        ' Recuperation des n° de lignes de debut et fin
        '   du texte selectionné
        Dim start_line, end_line As Integer
        start_line = textSelection.TopPoint.Line
        end_line = textSelection.BottomPoint.Line

        ' Initialisation des tampons a vide
        Dim tampon_methodes As String = ""
        Dim tampon_constructeur As String = ""
        Dim tampon_insert As String = ""
        Dim tampon_select As String = ""
        Dim tampon_delete As String = ""
        Dim tampon_update As String = ""

        ' Test si du texte est selectionné
        If textSelection.Text = "" Then
            MsgBox("Aucun texte selectionné !", MsgBoxStyle.Critical, "Erreur")
        ElseIf fileType <> ".vb" And fileType <> ".cs" Then
            ' Test du langage : VB.net ou C# !
            MsgBox("Cette macro ne peut s'executer que sur des fichiers VB.net (.vb) ou C# (.cs) !", MsgBoxStyle.Exclamation, "Erreur de langage")
        Else
            ' Boucle pour toutes les lignes selectionnés
            For i As Integer = start_line To end_line

                ' Allez puis selectionner la ligne
                textSelection.GotoLine(i)
                textSelection.SelectLine()

                ' Enregistrement dans tab (2 dimension) du nom et du type de la propriete
                Dim maClasse As Type = Type.GetType(textSelection.Text, True, True) 'C'EST ICI QUE CA PLANTE !!!!
                tampon_constructeur = CreateConstructeur(maClasse)
                tampon_insert = CreateInsert(maClasse)
                tampon_delete = CreateDelete(maClasse)
                tampon_update = CreateUpdate(maClasse)
                tampon_select = CreateSelect(maClasse)
            Next

            ' On suprrime le texte original
            For j As Integer = start_line To end_line
                textSelection.GotoLine(start_line)
                textSelection.SelectLine()
                textSelection.Delete()
            Next

            ' Pour finir, on insert les declarations des variables
            tampon_constructeur = "#Region ""Constructeur""" & vbCrLf & tampon_constructeur & vbCrLf & "#End Region"
            textSelection.Insert(tampon_constructeur)

            textSelection.NewLine()

            ' .... et les méthodes du CRUD
            tampon_methodes = tampon_select & vbCrLf & tampon_insert & vbCrLf & tampon_update & vbCrLf & tampon_delete
            tampon_methodes = "#Region ""Méthodes""" & vbCrLf & tampon_methodes & vbCrLf & "#End Region" & vbCrLf
            textSelection.Insert(tampon_methodes)
        End If

    End Sub


Bon le code de la macro n'est pas optimisé encore, mais je n'en suis encore qu'au début. Une fois la macro lancée, la ligne où çà plante est la suivante (voir commentaire dans le code aussi):
Dim maClasse As Type = Type.GetType(textSelection.Text, True, True)


L'erreur est la suivante:

Impossible de charger le type 'Personne' à partir de l'assembly 'VBAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'

En gros, il me dit je trouve pas où c'est ta classe!!!!

Alors j'ai bien essayer de passer le nom en y mettant l'assembly du projet, çà marche pas. J'ai essayer par un namespace, idem...
J'ai même essayer en chargeant carrément:
monAssembly as Assembly = Assembly.Load("monProjet")
et çà chie pareil...

Donc y-a-t'il une solution? Dois-je m'y prendre autrement? Dois-je faire autre chose que les macros?

Merci bien par avance de votre coopération.

1 réponse

cuicui6669 Messages postés 8 Date d'inscription lundi 31 décembre 2007 Statut Membre Dernière intervention 1 février 2010
1 févr. 2010 à 08:56
Bon et bien vu que j'ai pas trouvé et que j'ai pas de réponse, je vais faire une classe et non une macro. Si ma démarche intéresse quelqu'un, faites moi signe sinon je fermerai le post...
0
Rejoignez-nous