IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Conversion d'argument d'une fonction en hashtable


Sujet :

VB.NET

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Conversion d'argument d'une fonction en hashtable
    Bonjour à tous,
    Je cherche à convertir les paramètres d'une fonction pour les convertir en un hastable contenant le nom de la variable en key et sa valeur en value.
    J'ai trouvé comment récupérer le nom des paramètres avec la class parameterinfo, mais je n'ai pas de trouver une méthode pour récupérer la valeur de cette variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Function test(ByVal param1 As String, ByVal param2 As String) As Hashtable
            Dim hash As Hashtable = New Hashtable
            Dim stFrame As New StackFrame
            Dim currentMethod As System.Reflection.MethodBase = stFrame.GetMethod()
            Dim currentParameters() As System.Reflection.ParameterInfo = currentMethod.GetParameters()
            For Each param As System.Reflection.ParameterInfo In currentParameters
                hash.Add(param.Name, "valeur of param ?") 'Comment spécifier la valeur résultante ?)
            Next
            Return hash
        End Function
        Sub Main()
            Dim myhash As Hashtable = New Hashtable
            myhash = test("value1", "value2")
    End sub
    Je souhaiterais donc avoir dans myhash
    key / value
    param1 / value1
    param2 / value2

    Cela semble pourtant être tout bête...
    Ce qu'il me manque, ce serait comme pour faire en powershell un get-variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $var1="value1"
    $var2="value2"
    $nomvar="var1"
    Get-Variable $nomvar
     
    Name                           Value
    ----                           -----
    var1                           value1
    Merci

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Essaie peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     hash.Add(param.Name, param.DefaultValue)
    , ce qui récupérera les valeurs par défaut des paramètres

    Sinon,je ne pense pas que tu puisses faire ce que tu veux, car il faudrait pouboir arrêter le programme à l'intérieur de la fonction,pour examiner les paramètres passés par l'utilisateur...
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci pour ta réponse.
    malheureusement, ce n'est pas la valeur par défaut que je veux récupérer, mais la valeur actuelle.
    En fait, je voudrais l'équivalent à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Function test(ByVal param1 As String, ByVal param2 As String) As Hashtable
            Dim hash As Hashtable = New Hashtable
            Dim stFrame As New StackFrame
            Dim currentMethod As System.Reflection.MethodBase = stFrame.GetMethod()
            Dim currentParameters() As System.Reflection.ParameterInfo = currentMethod.GetParameters()
            hash.Add(currentParameters(0).Name, param1)
            hash.Add(currentParameters(1).Name, param2)
            'hash.Add(param.Name, param1)
            'For Each param As System.Reflection.ParameterInfo In currentParameters
            '    hash.Add(param.Name, "valeur of param ?") 'Comment spécifier la valeur résultante ?)
            'Next
            Return hash
        End Function
    mais faire une fonction plus générique sans spécifier param1 et param2 dans "hash.Add(currentParameters(0).Name, param1)". Avec polymorphisme de la fonction, cela éviterait de toucher le code pour chaque fonction.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Déjà pourquoi utiliser une Hashtable ? (à moins que tu sois en framework 1.1 mais j'en doute fortement) plutôt qi'une List ou Collection ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    une list ou une collection, pourquoi pas. J'ai choisi une hashtable car cela me permettait d'avoir une paire cle/valeur.
    Mais mon problème resterait cependant le même.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    De toute manière, ton problème n'est pas soluble avec cette voie : en effet, la seule chose que tu peux obtenir c'est des informations sur les méthodes, pas sur leur exécution dans une instance donnée.

    Vois plutôt du coté de l'injection de code, ou de l'AOP; éventuellement en utilisant un tisseur Aspect du type PostSharp. (ou autre, mais PostSharp est gratuit).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    ok
    il n'existe pas une methode pour résoudre ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim str1 = "valeur1"
            Dim res As String = Fonction("str1")
    En fait je souhaiterais avoir comme valeur dans res: valeur1

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par gremlinsy Voir le message
    ok
    il n'existe pas une methode pour résoudre ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim str1 = "valeur1"
            Dim res As String = Fonction("str1")
    En fait je souhaiterais avoir comme valeur dans res: valeur1
    Tu peux peut être le faire en l'appelant depuis la fonction même, et en examinant la stack avec les objects StackTrace et StackFrame.

    Mais je ne comprends pas du tout l'objectif fonctionnel ici.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    oui, c'est bien ce que j'ai essayé. Je récupère bien le nom des différents paramètres de la fonction. Si c'est un paramètre optionnel, je peux récupérer la valeur par défaut de ce paramètre si spécifié avec defaultvalue comme le spécifier supersnail. Mais malheureusement pas la valeur courante de celui ci.

    Le but est de créer une function "générique" qui puisse être copier en modifiant seulement sa signature.Ces fonctions appellent ensuite une fonction qui lance un runspace pour lancer des cmdlet Powershell(ça, c'est ok). Toutes ces fonctions ont donc la même structure du code.

    Par ex, ci dessous, je copie la 1ere function1, je la renomme et/ou je change juste le nombre des param (le nom du parametre correspond au paramètre passé dans la cmdlet powershell plus tard).Je ne modifie pas du tout le code des functions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Module Module1
        Function function1(ByVal param1 As String, ByVal param2 As String) As Boolean
            Dim hash As Hashtable = New Hashtable
            Dim stFrame As New StackFrame
            Dim currentMethod As System.Reflection.MethodBase = stFrame.GetMethod()
            Dim currentParameters() As System.Reflection.ParameterInfo = currentMethod.GetParameters()
            For Each param As System.Reflection.ParameterInfo In currentParameters
                hash.Add(param.Name, "valeur of param ?") 'Comment spécifier la valeur résultante ?)
            Next
            display(currentMethod.Name, hash)
            Return True
        End Function
     
        Function function1(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String) As Boolean
            Dim hash As Hashtable = New Hashtable
            Dim stFrame As New StackFrame
            Dim currentMethod As System.Reflection.MethodBase = stFrame.GetMethod()
            Dim currentParameters() As System.Reflection.ParameterInfo = currentMethod.GetParameters()
            For Each param As System.Reflection.ParameterInfo In currentParameters
                hash.Add(param.Name, "valeur of param ?") 'Comment spécifier la valeur résultante ?)
            Next
            display(currentMethod.Name, hash)
            Return True
        End Function
     
        Function function2(ByVal param1 As String, ByVal param2 As String) As Boolean
            Dim hash As Hashtable = New Hashtable
            Dim stFrame As New StackFrame
            Dim currentMethod As System.Reflection.MethodBase = stFrame.GetMethod()
            Dim currentParameters() As System.Reflection.ParameterInfo = currentMethod.GetParameters()
            For Each param As System.Reflection.ParameterInfo In currentParameters
                hash.Add(param.Name, "valeur of param ?") 'Comment spécifier la valeur résultante ?)
            Next
            display(currentMethod.Name, hash)
            Return True
        End Function
     
        Sub display(ByVal nomfunction As String, ByVal hashtable As Hashtable)
            Console.WriteLine(String.Format("Nom de la fonction:" & nomfunction))
            For Each AttributeName As String In hashtable.Keys
                Console.WriteLine(String.Format("     Nom du param:{0} , valeur:{1}", AttributeName, hashtable(AttributeName)))
            Next
        End Sub
     
        Sub Main()
            Dim res As Boolean
            res = function1("Param1WithFn1", "Param2WithFn1")
            res = function1("Param1WithFn1", "Param2WithFn1", "Param3WithFn1")
            res = function2("Param1WithFn2", "Param2WithFn2")
     
        End Sub
     
    End Module
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Nom de la fonction:function1
         Nom du param:param1 , valeur:valeur of param ?
         Nom du param:param2 , valeur:valeur of param ?
    Nom de la fonction:function1
         Nom du param:param1 , valeur:valeur of param ?
         Nom du param:param3 , valeur:valeur of param ?
         Nom du param:param2 , valeur:valeur of param ?
    Nom de la fonction:function2
         Nom du param:param1 , valeur:valeur of param ?
         Nom du param:param2 , valeur:valeur of param ?
    Je souhaiterais donc avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nom de la fonction:function1
         Nom du param:param1 , valeur:Param1WithFn1
         Nom du param:param2 , valeur:Param2WithFn1
    ...
    Voilà, je ne sais pas si tu vois ce que je souhaite faire.

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par gremlinsy Voir le message
    Voilà, je ne sais pas si tu vois ce que je souhaite faire.
    Assez vaguement, car je ne vois pas bien l'objectif fonctionnel, mais bon.

    Sinon, je maintiens que le plus propre serait de procéder via injection code en utilisant un tisseur aspect. (PostSharp déjà mentionné).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

Discussions similaires

  1. [VBA-E] Lister les arguments d'une fonction
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/02/2006, 12h04
  2. Récupération d'arguments sur une fonction
    Par p0Kep0K dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 21/09/2005, 09h17
  3. premier argument d'une fonction
    Par Ickou dans le forum Langage
    Réponses: 3
    Dernier message: 10/09/2005, 14h17
  4. une url comme argument d'une fonction
    Par khayyam90 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/10/2004, 20h15
  5. passer FILE* en argument d une fonction
    Par Monsieur_Manu dans le forum C
    Réponses: 9
    Dernier message: 10/04/2003, 17h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo