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

Dotnet Discussion :

Interpréter un string comme fonction


Sujet :

Dotnet

  1. #1
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut Interpréter un string comme fonction
    Bonjour à tous ,

    Je développe une application pour gérer des produits financiers.

    En gros, voilà ce que je veux faire:

    Je dois calculer la valeur de ces produits sachant que lors de la programmation, je ne connais pas leur formules.

    Disons que le produit A est une fonction F(x).
    x est connu mais F sera saisie lors de l'exécution du programme sous forme de chaîne de caractère.

    Disons que F sera "x^2"

    Y-a-t il un moyen d' "interpréter" la chaîne de caractère sous forme de fonction et l'exécuter ?

    J'ai regardé sur MSDN mais ce que j'ai trouvé c'est des Delegates qui sont une espèce de pointeurs sur des fonction. Cette technique ne marche pas pour moi vu qu'elle suppose que la fonction a été crée lors du développement de l'application et la fonction est passée sous forme d'argument à une autre.

    La fonctionnalité que je recherche existe sur Matlab. Elle interprète une chaîne de caractère sous forme de fonction.

    Exemple :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyString = '@(x)x^2' ;
    F = str2func(MyString) ;
    F sera désormais un handle (l'équivalent de delegates sur VB.net) de la fonction tapée lors de l'exécution.
    à la fin F(2) = 4.

    Merci de votre aide .

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    CodeDom!
    mais injection de code.

  3. #3
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Bonjour,

    Une bonne Inversion Of Control via Unity avec une conf en xml...
    Voilou
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par benji_dv Voir le message
    Une bonne Inversion Of Control via Unity avec une conf en xml...
    Bah je vois pas trop comment ça va régler le problème... il s'agit de générer du code à partir de texte

  5. #5
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut
    Citation Envoyé par benji_dv Voir le message
    Bonjour,

    Une bonne Inversion Of Control via Unity avec une conf en xml...
    Voilou
    Merci benji_dv,

    pourras-tu détailler un peu plus ta proposition ?
    j'ai pas très bien compris.

    Merci

  6. #6
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut
    Citation Envoyé par Graffito Voir le message
    CodeDom!
    mais injection de code.
    Merci Graffito mais il s'agit d'une application qui sera entièrement installée chez le client avec ses bases de données et tout...

    Donc le risque est peu présent car ce qu'on cherchera à récupérer comme information par de l'injection de code peut se faire simplement en ouvrant les bases de données sur Oracle.

  7. #7
    Membre éclairé
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Par défaut
    Bonjour,

    En attendant la réponse de Benji_dv, je peux proposer plusieurs solutions:

    1/ Utiliser les capacités d'évalutations d'expression des objets DataTable
    http://msdn.microsoft.com/en-us/libr...(v=vs.71).aspx

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    object valeur = new System.Data.DataTable().Compute(expression, null);
    2/ Utiliser eval du javascript
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Type scriptType = Type.GetTypeFromCLSID(Guid.Parse("0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC"));
     
    dynamic instance = Activator.CreateInstance(scriptType, false);
    instance.Language = "javascript";
     
    var result = obj.Eval("Math.pow(x, 6)");
    3/Créer ton parser. Cela est plus compliqué mais te permettra de choisir les opérandes à gérer.

    Personnellement, j'ai utilisé le codedom mais je trouve que les performances se dégradent dès lors qu'il y a beaucoup d'expressions à évaluer.
    L'évaluation des expressions des DataTable fonctionne bien. C'est juste qu'il aurait été plus beau que ce soit découplé des objets DataTable dont on n'a pas forcément besoin.
    Enfin, le parser maison à l'avantage d'être très rapide. Personnellement, j'ai utilisé la notation polonaise inverse lors de l'enregistrement des formules pour optimiser les temps de calculs.


  8. #8
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Effectivement la méthode d'évaluation par JS est top ! je n'y aurais pas pensé.

    Moi je proposais du pseudo dynamique (valable tant que le côté variable de l'opération à effectuer reste modéré) :
    Créer une interface, un assembly d'implémentation injecté via IOC Unity.
    Si l'opération change, on ne doit que recréer un assembly implémentant l'interface et modifier éventuellement le paramétrage Unity pour injecter la nouvelle instance.

    Si ton besoin est en mode full dynamic (genre cellule excel)... bah ma technique ne marche pas.

    A propos d'excel, as tu pensé à piloter une feuille excel ?
    tu peux effectivement injecter du contenu dans les cellules, et normalement récupérer les valeurs obtenues.
    En version Office 2013, je sais que le pilotage Office VSTO est moins génant qu'auparavant (process fantomes)

    Voilou !
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

Discussions similaires

  1. string comme parametre constant dans une fonction
    Par jfjobidon dans le forum Débuter
    Réponses: 9
    Dernier message: 06/06/2015, 23h21
  2. [XL-2010] Interpréter une string comme une formule dans VBA (pas cellule Excel)
    Par Quentin77170 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 09/05/2015, 23h04
  3. Méthode/ fonction avec un String comme "return"
    Par foggiat dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/11/2014, 02h02
  4. Interpréter une variable string comme constante
    Par _jerem dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2008, 01h05
  5. store proc comme fonction
    Par Bernybon dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 12/03/2004, 21h45

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