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

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

    Informations forums :
    Inscription : décembre 2007
    Messages : 332
    Points : 168
    Points
    168

    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 387
    Points : 598
    Points
    598

    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
    332
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : décembre 2007
    Messages : 332
    Points : 168
    Points
    168

    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. Réponses: 2
    Dernier message: 09/11/2006, 10h14
  2. Réponses: 5
    Dernier message: 20/09/2006, 14h16
  3. Réponses: 4
    Dernier message: 09/05/2006, 19h25
  4. Utilisation d'expression régulière
    Par red210 dans le forum java.util
    Réponses: 4
    Dernier message: 16/04/2005, 17h45
  5. Réponses: 5
    Dernier message: 11/06/2002, 16h21

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