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 :

Utilisation de Expression<Func<T>> dans un constructeur générique


Sujet :

C#

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Utilisation de Expression<Func<T>> dans un constructeur générique
    Bonjour,

    Je cherche à faire une classe de critère générique.

    Voici quelques exemples de comment je souhaiterais l'instancier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonCritereComparaison<Document> critere = new MonCritereComparaison<Document>(o=>o.Numero,Comparaison.Egal,"BL001");
    MonCritereComparaison<Document> critere = new MonCritereComparaison<Document>(o=>o.Date,Comparaison.Inferieur,DateTime.Today.AddDays(-30));
    Voici le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MonCritereComparaison<T> where T : class
    {
            public MonCritereComparaison(Expression<Func<T>> propertyLambda, ComparisonOperator comparisonOperator, object value)
            {
    ....
            }
    }
    Je me suis basé sur des codes utilisés pour les notifications de NotifyPropertyChanged que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    protected void RaisePropertyChanged<T>(Expression<Func<T>> action)
    {
          var propertyName = GetPropertyName(action);
          RaisePropertyChanged(propertyName);
    }
    private static string GetPropertyName<T>(Expression<Func<T>> action)
    {
          var expression = (MemberExpression)action.Body;
          var propertyName = expression.Member.Name;
          return propertyName;
    }
    qui permet de lever l'évènement de PropertyChanged de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     RaisePropertyChanged(() => MyProperty);
    Cependant, je n'arrive pas à implémenter mon constructeur, puisqu'intellisense ne me propose aucune propriété de la classe Document.
    Qu'est ce que j'ai manqué dans ce code?

    Merci d'avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Expression<Func<T>> demande une méthode qui ne prend pas de paramètre et renvoie une valeur ; or o => o.Numero a bien besoin d'un paramètre. Par ailleurs en procédant ainsi tu t'obliges à passer par de l'introspection et ça va compliquer les choses pour rien. Je peux te proposer autre chose :

    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
    public class MonCritereComparaison<TParam, TProperty> where TParam : class
    {
      private Func<TParam, TProperty> _getProp;
      public MonCritereComparaison(Func<TParam, TProperty> getProp, ComparisonOperator comparisonOperator, TProperty value) / on peut garder un type object pour le dernier paramètre
      {
        _getProp = getProp;
    ...
      }
     
      // je ne sais pas quel système de comparaison tu as prévu, c'est juste un exemple ici
      public bool Validates(TParam candidate)
      {
        TProperty propValue = _getProp(candidate);
        // code pour la comparaison
    ...
      }
    }
    À utiliser ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonCritereComparaison<Document, long> critere = new MonCritereComparaison<Document>(o=>o.Numero,Comparaison.Egal,"BL001");
    MonCritereComparaison<Document, DateTime> critere = new MonCritereComparaison<Document>(o=>o.Date,Comparaison.Inferieur,DateTime.Today.AddDays(-30));
    À noter qu'il y a pas mal de chose en matière de comparaison et de validation dans le Framework ; tu peux regarder par exemple du côté des delegates Predicate<T> et Comparison<T>.

  3. #3
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    Merci Noxen,

    Effectivement passer par un Func devrait me faciliter la tâche. quand on est dans le jus on ne voit pas forcément la solution apparaitre.

    Je testerais cela lundi en arrivant au boulot.

Discussions similaires

  1. [SimpleXML] Est-il possible d'utiliser des expressions XPATH 2.0 avec simplexml ?
    Par ANISSS dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/11/2006, 09h14
  2. Réponses: 5
    Dernier message: 20/09/2006, 13h16
  3. utiliser une expression régulliere avec la methode getelementbyid
    Par rootdaoud dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/05/2006, 18h25
  4. Utilisation d'expression régulière
    Par red210 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 16/04/2005, 16h45
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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