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

C# Discussion :

Generer dynamiquement une expression grâce à de la reflexion


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Développeur .NET
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut Generer dynamiquement une expression grâce à de la reflexion
    Salut tout le monde, je suis actuellement entrain de générer un petit programme qui génère de manière dynamique des expressions, sauf que je suis coincé à endroit :

    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
     
    namespace testExpressionCall
    {
        class Personne
        {
            public string Nom { get; set; }
            public string Prenom { get; set; }
            public double Age { get; set; }
        }
     
        class Program
        {
            static void Main(string[] args)
            {
                PropertyInfo propriete = typeof(Personne).GetProperty("Age");
                MethodInfo methode = typeof(PropertyInfo).GetMethod("GetValue", new System.Type[] { typeof(object), typeof(object[]) });            
                var p = Expression.Parameter(typeof(object), "p");
                object[] vide = new object[0];
                Expression G = Expression.Call(
                    Expression.Constant(propriete),
                    methode,
                    p,
                    Expression.Constant(vide));
                var lambda = Expression.Lambda<Func<Personne, object>>(G, p);
                var predicat = lambda.Compile();
                //MethodInfo test = typeof(Enumerable).GetMethod("Sum");
                MethodInfo methodeFunction = typeof(Enumerable).GetMethod("Sum", new Type[] { typeof(IEnumerable<double>), typeof(Func<double, double>) });
                Type T = G.Type;
                Expression function = Expression.Call(null, methodeFunction, lambda);
     
                Console.WriteLine(function.ToString());
                //Assert
            }
        }
    }
    Je ne sais pas quel type je dois déclarer dans le 2eme parametre de ma méthode getMethod pour atteindre dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static double Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector);
    Je suis un peu embêté avec cet histoire de func et je ne sais pas comment m'y prendre. Merci.

    Zunk

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Tu peux essayer avec :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
        var methodeFunctionGenericsList = typeof(Enumerable).GetMethods().Where(d => d.Name.ToLower().Contains("sum") && d.IsGenericMethod);
     
        var methodeFunctionGeneric = methodeFunctionGenericsList.Where(d => d.GetParameters().Any(param => param.Position == 1 && param.ToString().Contains("Double"))).FirstOrDefault();
     
        var methodeFunctionDouble = methodeFunctionGeneric.MakeGenericMethod(new[] { typeof(double) });

    Pas super beau, mais ça doit aller.
    Je cherche d'abord la liste des méthodes génériques qui s'appellent "Sum".
    Après, je prend la première qui à "double" dans la définition du second paramètre.
    J'obtient alors une méthode générique de style Sum<T>(IEnumerable<T>,Func<T,double>).
    Il ne me reste plus qu'a créer une méthode à partir de ce genérique, avec T = Double.

    L'idéal serait, à la deuxième ligne, de parser les paramètre au lieu de mon raccourcis.

  3. #3
    Membre averti
    Profil pro
    Développeur .NET
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut
    Super merci beaucoup !

  4. #4
    Membre averti
    Profil pro
    Développeur .NET
    Inscrit en
    Mai 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2012
    Messages : 13
    Par défaut Generer dynamiquement un Group By avec des Expression Lambda et de la reflection
    Creation d'un nouveau sujet : Lien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une expression dynamiquement
    Par anthyme dans le forum Linq
    Réponses: 0
    Dernier message: 02/02/2009, 11h23
  2. Réponses: 3
    Dernier message: 23/05/2006, 15h09
  3. "Différence de type dans une expression" Tquery
    Par Hakim dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/04/2004, 00h22
  4. ajouter un champ dynamiquement à une instance de table
    Par maniack dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/02/2004, 23h58
  5. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06

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