Bonjour,
J'ai une problématique d'expressions lambda. L'idée est de trier une liste en fonction de propriétés contenues dans une arborescence de chaque objet (profondeur de 1 à 5 sur le projet réel en fonction de la demande).
Pour ce faire, on crée un expression lambda en dehors de Linq via des ExpressionMember (code simplifié).
avec la classe "MaClasse" super complexe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 var param = Expression.Parameter(typeof(MaClasse)); SortDirection sortDirection = SortDirection.Descending; MemberExpression keySelectExpr = Expression.Property(Expression.Property(param, "MaSousClasse"), "MonNom") ; // On utiliser la classe Sorter définie dans l'assembly courante IList<MaClasse> orderedList = new SorterClass<MaClasse>().Sort(maListe, param, keySelectExpr, sortDirection);
L'évaluation fonctionne bien si tous les chemins existent (toutes les instances de MaClasse de premier niveau contiennent une référence) mais l'évaluation plante s'il manque au moins une des sous références. Ainsi avec la liste suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class MaClasse { public String MonNom { get; set; } public MaClasse MaSousClasse { get; set; } }
L'évaluation "MaSousClasse.MonNom" ne peut s'exécuter car l'une des références de MaSousClasse est vide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IList<MaClasse> maListe = new List<MaClasse> { new MaClasse{MonNom = "AAAA", MaSousClasse = new MaClasse{MonNom = "BBBB.AAAA"}}, new MaClasse{MonNom = "Test", MaSousClasse = null}};
Une exception de type NullReferenceException est levée par le Convert.
Est-ce qu'il y a un moyen pour intervenir lors de l'évaluation pour chaque instance ?
Ou est-ce qu'il y a un moyen de lui fournir une valeur par défaut lorsqu'une référence est nulle ?
Ou un autre moyen ?
Yannick
Partager